![](/img/trans.png)
[英]Sequelize findOrCreate() — .catch() block executed after spread() during no error
[英]Sequelize findOrCreate(…).spread is not a function
我正在使用 sequelize 6。当我运行findOrCreate().spread
时,它显示“findOrCreate(...).spread 不是函数”。 这是我的代码:
const response = await Response.findOrCreate({
where: {
participantId,
questionId,
},
defaults: responseNewDetail,
})
return res.status(200).send({ status: 0, data: response })
这工作正常,但它没有将创建状态和 model 值分开。 当我尝试使用传播时:
Response.findOrCreate({
where: {
participantId,
questionId,
},
defaults: responseNewDetail,
}).spread(function(response,created){
return res.status(200).send({ status: 0, data: response })
})
它说“Response.findOrCreate(...).spread 不是函数”。 这是 model 文件(response.js):
const { Sequelize } = require("sequelize")
module.exports = (sequelize, DataTypes) =>
sequelize.define(
"Response",
{
responseId: {
type: DataTypes.INTEGER,
primaryKey: true,
allowNull: false,
field: "Response_ID",
autoIncrement: true,
},
companyId: {
type: DataTypes.INTEGER,
allowNull: false,
field: "Company_ID",
},
...
)
响应 model:
const ResponseModel = require("../models/response")
const Response = ResponseModel(sequelize, DataTypes)
有谁知道出了什么问题?
由于您使用的是等待,因此您可以更改:
const response = await Response.findOrCreate({
where: {
participantId,
questionId,
},
defaults: responseNewDetail,
})
return res.status(200).send({ status: 0, data: response })
至
const [ response, created ] = await Response.findOrCreate({
where: {
participantId,
questionId,
},
defaults: responseNewDetail,
})
return res.status(200).send({ status: 0, data: response })
一切都会好起来的。
这并没有解决传播问题,但不是 function 的事情。 为此,我只在从旧版本升级 sequelize 时才注意到这一点(我从版本 1 开始就一直在使用 sequelize)。 您的传播示例确实应该有效,但无论出于何种原因,它都不再有效(它也不适合我)。 通常我唯一一次使用传播而不是等待它是当我想推迟执行某些事情时。 对或错,我已经开始解决这个问题,只需将 await/async 版本包装在:
setImmediate(async () => {
// async things here
});
希望我有所帮助,如果我没有,对不起。
庆祝布赖恩的回答:-
findOrCreate
返回两个值第一个 model 实例和第二个创建状态,所以你可以使用
const [model,created] = ModelName.findOrCreate();
(您的案例中的模型响应)
获得创建状态。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.