Sequelize不返回queryAsync对象

时间:2019-06-23 17:33:57

标签: node.js promise async-await sequelize.js

我正在通过使用async await建立nodejs api。因此我的控制器的每个函数都是异步的,并通过模型接收一个Promise。对于查询,我使用了sequelize包与数据库进行交互。为了使用sequelize异步查询行为,我选择了bluebird插件来实现随意性。

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 :(得分:0)

您所做的完全没有必要。您将返回包装了异步函数的新promise(异步函数总是返回promise,这就是它们的工作方式)。在该函数中,您要调用已返回promise的sequelize查询方法。

在sequelize上也使用promisifyAll是完全不必要和多余的,因为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);
    }
}