gpt4 book ai didi

node.js - Sequelize : calculate values before creating AND updating

转载 作者:太空宇宙 更新时间:2023-11-03 22:32:45 24 4
gpt4 key购买 nike

我的问题类似于 Sequelize calculate value before saving ,但并不完全相同。

我还有一个模型,其中一个字段将被设置,另一个字段永远不会被设置,但应在每次保存到数据库的操作之前进行计算。我试图通过使用钩子(Hook)来实现这一点。

var Foo = sequelize.define(
'foo',
{
bar: { type: Sequelize.TEXT, allowNull: false },
baz: { type: Sequelize.TEXT, allowNull: false }
},
{
freezeTableName: true,
timestamps: false,
hooks: {
// beforeCreate: setBaz
// beforeUpdate: setBaz
beforeValidate: setBaz
}
}
);

function setBaz(foo) {
foo.baz = foo.bar + "_baz";
}

这适用于创建但不适用于更新现有元素。

Foo.create({bar: "bar"});

correclty 创建以下语句

INSERT INTO "foo" ("id","bar","baz") VALUES (DEFAULT,'bar','bar_baz') RETURNING *;

但是,

Foo.findOne({where: {id: 1}})
.then(function(foo) {
return foo.update({bar: "foobar"});
});

这些语句的结果

SELECT "id", "bar", "baz" FROM "foo" AS "foo" WHERE "foo"."id" = 1;    
UPDATE "foo" SET "bar"='foobar' WHERE "id" = 1

显然只是为bar设置新值。

当像这样记录更改时

function setBaz(foo) {
console.log(foo);
foo.baz = foo.bar + "_baz";
console.log(foo);
}

我可以看到函数已执行并且值设置正确。之前:

dataValues: { id: 1, bar: 'foobar', baz: 'bar_baz' },
_previousDataValues: { id: 1, bar: 'bar', baz: 'bar_baz' },
_changed: { bar: true },

之后:

dataValues: { id: 1, bar: 'foobar', baz: 'foobar_baz' },
_previousDataValues: { id: 1, bar: 'bar', baz: 'bar_baz' },
_changed: { bar: true, baz: true },

更改后的标志也设置正确。

我之前尝试过使用 beforeCreatebeforeUpdate Hook ,但这会导致创建情况下出现错误,这似乎是合理的。

Unhandled rejection SequelizeValidationError: notNull Violation: baz cannot be null

使用get/setDataValue也不会改变任何事情

foo.setDataValue("baz", foo.getDataValue("bar") + "_baz");

有关钩子(Hook)的文档非常稀疏,因此我们将不胜感激。我怎样才能获得sequelize来更新计算字段?

最佳答案

看起来sequelize在调用验证 Hook 之前计算更改的字段。为了覆盖它,您可以更改传递的选项中的字段

function setBaz(foo, o) {
if(_.contains(o.fields, "bar")) { // if bar was not changed, nothing has to be done
foo.setDataValue("baz", foo.getDataValue("bar") + "_baz");

if(!_.contains(o.fields, "baz")) {
o.fields.push("baz"); // Adjust the fields to be saved
_.pull(o.skip, "baz"); // Also adjust the skipped fields, for consistency
}
}
return Promise.resolve(o);
}

关于node.js - Sequelize : calculate values before creating AND updating,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34199284/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com