gpt4 book ai didi

node.js - 使用增量函数进行序列化验证

转载 作者:行者123 更新时间:2023-12-03 22:30:23 26 4
gpt4 key购买 nike

有一个 sequelize 函数允许将一个值递增一个数字,该数字可以是负数或递减,我想确保该列始终为正数或 0,因此我向我的模型添加了一个验证器:

module.exports = function (sequelize, DataTypes) {
var ProductVariant = sequelize.define('ProductVariant', {
id: {
type: DataTypes.INTEGER(11),
allowNull: false,
primaryKey: true,
autoIncrement: true
},
ProductId: {
type: DataTypes.STRING(45),
field: 'product_id',
allowNull: false,
primaryKey: true,
references: {
model: 'product',
key: 'id'
}
},
image: {
type: DataTypes.INTEGER(11),
allowNull: true
},
price: {
type: DataTypes.DECIMAL(6, 2),
allowNull: false
},
qty_stock: {
type: DataTypes.INTEGER(11),
allowNull: false,
defaultValue: 0
},
createdAt: {
type: 'TIMESTAMP',
allowNull: true,
field: 'creation_date'
},
updatedAt: {
type: 'TIMESTAMP',
field: 'last_updated',
allowNull: true
},
},
{
tableName: 'variants',
hooks: {
beforeValidate: function(variant, options) {
if (variant.qty_assigned < 0) {
throw new Error('Not valid');
}
}
}
});

ProductVariant.associate = function (models) {
ProductVariant.belongsTo(models.Product)
},
{
indexes:
[{
unique: true,
fields: ['product_id']
}]
}

return ProductVariant;
};
但是当我这样做时:
await ProductVariant.increment({ qty_assigned: -100 }, {
where: { id: { [Op.eq]: variantId } },
transaction: t
});
我在不检查验证的情况下工作并更新值。我也试过:
qty_stock: {
type: DataTypes.INTEGER(11),
allowNull: false,
defaultValue: 0,
validate: {
min: 0
}
}
这可能与增量在数据库中完成的事实有关吗?我可以做些什么来添加验证吗?

最佳答案

验证是针对实例(在您的应用程序中)而不是针对数据库完成的。
增量 API 是特殊的,因为它直接在数据库中而不是在实例上更新值
来自 https://sequelize.org/master/class/lib/model.js~Model.html#static-method-increment(强调我的)

Increment the value of one or more columns. This is done in the database, which means it does not use the values currently stored on the Instance. The increment is done using a SET column = column + X WHERE foo = 'bar' query. To get the correct value after an increment into the Instance you should do a reload.


如果您想增加并完成验证,您可以:
  • 使用事务(或乐观锁定)并手动更新增加实例的值(使用 sequelize 验证)
  • 在数据库中添加一个检查(mysql8+:https://dev.mysql.com/doc/refman/8.0/en/create-table-check-constraints.html)。
  • 关于node.js - 使用增量函数进行序列化验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67643436/

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