Как выполнить sql запрос используя async/await в node 7?

361
26 ноября 2016, 18:01

Допустим я использую node-mysql из npm для выполнения sql-запросов. С появлением node 7 и поддержки ней async/await, хотелось бы понять, как можно применить это для выполнения sql запросов? Задача в целом написать класс-обертку для node-mysql, чтобы потом можно было делать нечто вроде:

let data = new MySqlWrapper().select(query);

ну и в итоге в data мы имеем результат выполнения запроса.

Подскажите как можно реализовать это на данном примере:

(async () => {
            let getData = async ()=> {
                db.query(`select * from users`,null,(err,data) =>{
                    console.log('ok');
                    return data;
                });
            };
            var res = await getData();
            //нужно чтобы в res пришли данные запроса
})();
Answer 1

Конструкции async/await отлично работают не только с асинхронными функциями, но и с Обещаниями (Promises). Например, код

let select = function(query) {
    return new Promise(function(resolve, reject) {
        setTimeout(() => {resolve(`${query}s`)}, 1000);
    });
};
async function run() {
    let foos = await select('foo');
    let bars = await select('bar');
    console.log(`${foos} + ${bars}`);
}
run();

выведет сообщение foos + bars через две секунды.

Эта маленькая хитрость позволит вам решить вашу проблему "малой кровью". Вы можете использовать одну из существующих библиотек, чтобы заставить ваши методы возвращать Обещания. Приведу пример того, это можно сделать используя Bluebird:

let bluebird = require('bluebird'),
    asyncWrapper = (f, ctx) => bluebird.promisify(f, {context: ctx});
let mysql = new MySql();
let data = await asyncWrapper(mysql.select, mysql)(query);

При желании, вы можете написать класс, содержащий в себе новый, асинхронный API. Но эта задача тривиальна и я оставлю ее для вас :)

READ ALSO
как задать не статичный свет

как задать не статичный свет

У меня obj loader c orbitcontrol, мне нужно не статичное освещение, чтобы фигура освещалась по мере прокрутки ее, а другие стороны затемнялись немногоЯ...

168
Получение координат метки в событии Я.Карт

Получение координат метки в событии Я.Карт

Как получить изначально заданные координаты метке?

232
Как проверить на undefined?

Как проверить на undefined?

Есть код который выводит сумму чисел в массиве, без наибольшего и наименьшего значенияНе могу проверит входное значение на undefined

328