Sequelize не возвращает объект queryAsync - PullRequest
1 голос
/ 23 июня 2019

Я создаю API-интерфейс nodejs с помощью async await. Поэтому для моего контроллера каждая функция асинхронная, которая получает обещание по модели.Для запроса я использовал пакет sequelize для взаимодействия с базой данных.для использования sequelize асинхронного запроса я выбираю плагин bluebird для promisfy.

Promise.promisifyAll(sequelize)

В моей модели у меня есть метод, который возвращает данные, но когда я вызываю sequelize.query, он возвращает данные, но когда янапишите sequelize.queryAsync, он не должен возвращать данные.Функция существует, когда я печатаю объект sequelize.Я хочу знать, как получить данные queryAsync.

LeadModel.getActiveRecords = function () {
  return new Promise(async (resolve, reject) => {
    try {
      let output = await LeadModel.sequelize.queryAsync("SELECT * FROM some_tbl where status = '1'")
      // This below query is working fine without queryAsync
      //let output = await LeadModel.sequelize.query("SELECT * FROM some_tbl where status = '1'")
      resolve(output)
    } catch (e) {
      reject(e)
    }d
  })
}

В контроллере я использую этот способ.

LeadController.getlead = async function(req, res) {
    try {
        let datanew = await LeadModel.getActiveRecords();
        console.log(datanew);
    } catch (e) {
        throw e;
    }
}

Подскажите, пожалуйста, почему сиквелиз не возвращает результат асинхронного запроса.

1 Ответ

0 голосов
/ 25 июня 2019

То, что вы делаете, совершенно ненужно. Вы возвращаете новое обещание, заключающее в себе асинхронную функцию (асинхронные функции всегда возвращают обещания, вот как они работают). И в этой функции вы вызываете метод запроса sequelize, который уже возвращает обещание.

Также использование promisifyAll для sequelize совершенно не нужно и избыточно, поскольку sequelize уже асинхронен, и вы можете использовать большинство методов с async / await.

Это будет делать то же самое, что вы делаете:

LeadModel.getActiveRecords = function() {
    return LeadModel.sequelize.query("SELECT * FROM some_tbl where status = '1'");
}

// Or you can do it in a single line
LeadModel.getActiveRecords = () => LeadModel.sequelize.query("SELECT * FROM some_tbl where status = '1'");

И использовать его в контроллере:

LeadController.getlead = async function(req, res, next) {
    try {
        let datanew = await LeadModel.getActiveRecords();
        console.log(datanew);
    } catch (e) {
        console.log(e);
        return next(err);
    }
}
...