Sequelize 不返回 queryAsync 对象

Posted

技术标签:

【中文标题】Sequelize 不返回 queryAsync 对象【英文标题】:Sequelize is not returning queryAsync object 【发布时间】:2019-11-05 15:44:20 【问题描述】:

我正在使用异步等待构建 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;
    

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

【问题讨论】:

sequelize.query 返回一个承诺,不需要promisifyAll 它。 它需要 promisifyAll 因为我使用了 var Promise = require('bluebird') Promise.promisifyAll(sequelize) 。它将在所有查询中添加异步功能。 【参考方案1】:

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

【讨论】:

感谢@grimurd。现在我知道 sequelize 已经返回了一个承诺,所以我们不需要编写额外的代码。

以上是关于Sequelize 不返回 queryAsync 对象的主要内容,如果未能解决你的问题,请参考以下文章

Sequelize-创建实例后不返回承诺

Sequelize on GraphQL update 不返回任何内容

使用哪种方法在 SQLite 中搜索大量记录 QueryAsync 或 Query

Sequelize - 在 where 子句中查询其他表

sequelize/sequelize-typescript - 带有 HasMany 的 findAll 返回一个对象而不是数组

sequelize.query() 两次返回相同的结果