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 on GraphQL update 不返回任何内容
使用哪种方法在 SQLite 中搜索大量记录 QueryAsync 或 Query
sequelize/sequelize-typescript - 带有 HasMany 的 findAll 返回一个对象而不是数组