首页 > 解决方案 > Sequelize 不返回 queryAsync 对象

问题描述

我正在使用异步等待构建nodejs api。所以我的控制器每个函数都是异步的,它接收模型的承诺。对于查询,我使用了 sequelize 包来与数据库进行交互。对于使用 sequelize 异步查询行为,我选择 bluebird 插件进行 promisfy。

Promise.promisifyAll(sequelize)

在我的模型中,我编写了一个返回数据的方法,但是当我调用 sequelize.query 时,它会返回数据,但是当我编写 sequelize.queryAsync 时,它不应该返回数据。当我打印续集对象时,该功能存在。我想知道如何获取 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;
    }
}

你能帮我弄清楚为什么续集不返回异步查询结果。

标签: node.jspromiseasync-awaitsequelize.js

解决方案


你在做什么是完全没有必要的。您正在返回一个包装异步函数的新承诺(异步函数总是返回承诺,这就是它们的工作方式)。在该函数中,您正在调用已经返回承诺的 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);
    }
}

推荐阅读