【问题标题】:Sequelize findOrCreate(...).spread is not a functionSequelize findOrCreate(...).spread 不是函数
【发布时间】:2020-12-01 17:53:42
【问题描述】:

我正在使用 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 })

这工作正常,但它没有将创建状态和模型值分开。 当我尝试使用传播时:

Response.findOrCreate({
    where: {
        participantId,
        questionId,
    },
    defaults: responseNewDetail,
}).spread(function(response,created){
    return res.status(200).send({ status: 0, data: response })
})

它说“Response.findOrCreate(...).spread 不是一个函数”。 这是模型文件(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",
            },
...
    )

响应模型:

const ResponseModel = require("../models/response")
const Response = ResponseModel(sequelize, DataTypes)

有谁知道怎么回事?

【问题讨论】:

  • 在你的第二个例子中,.spread(),你还在用await Response.findOrCreate吗?
  • 如果可以的话,我希望使用 await 作为第一个。但这里的问题是 .spread() 不是一个函数,我只想返回模型而不是包含创建的状态.我用的和stackoverflow.com/questions/53042399/…一样,但是没用。

标签: javascript node.js sequelize.js


【解决方案1】:

由于你使用的是await,你可以更改:

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 })

一切都会好起来的。

但这并没有解决传播问题,而不是功能问题。为此,我只在从旧版本升级 sequelize 时才注意到这一点(我从版本 1 开始就一直在使用 sequelize)。您的传播示例确实应该有效,但无论出于何种原因,它都不再有效(它也不适合我)。通常我唯一一次使用传播而不是等待它是当我想推迟执行某些事情时。对或错,我已经开始解决这个问题,只需将 await/async 版本包装在:

setImmediate(async () => {
    // async things here
});

希望我能帮上忙,如果我没有帮上忙,请见谅。

【讨论】:

  • 为什么response 不返回id
【解决方案2】:

庆祝Brian's Answer :-

findOrCreate 返回两个值第一个模型实例和第二个创建状态, 所以你可以使用

const [model,created] = ModelName.findOrCreate();

(您的案例中的模型响应)

获取创建状态。

【讨论】:

    猜你喜欢
    • 2018-04-05
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 2020-04-08
    • 2018-07-30
    相关资源
    最近更新 更多