1
在express.js中使用sequelize.js。如何用sequelize.js創建替換操作?
我需要用新實例替換現有的模型實例。我希望在保存替換之前驗證新實例,以確保所有必填字段都存在。但是,validate()
無法正常工作。在以下示例中,req.body
缺少requiedId
。我創建了一個新的location
,從req.body
開始對其設置someAttribute
,並致電validate()
。由於缺少requiredId
,並且該模型將其定義爲allowNull: false
,所以我期望驗證錯誤。情況並非如此,更新愉快地運行。
sequelize.define('location', {
locationId: {
type: DataTypes.STRING,
allowNull: false,
primaryKey: true,
},
requiredId: {
type: DataTypes.INTEGER,
allowNull: false,
},
someAttribute: {
type: DataTypes.STRING,
defaultValue: 'baz'
});
var location;
models.location.findById(locationId)
.then(function (data) {
location = data;
var replacement = models.location.build({});
// req.body = { someAttribute: 'value' }
_.assign(replacement, req.body);
return replacement.validate()
.then(function() {
return location.update(replacement.toJSON());
});
}
})
.then(function() {
res.send('success');
})
.catch(function (err) {
res.status(400).send({ error:err });
});
如果我手動添加null
值requiredId
,然後按預期發生驗證錯誤。
_.assign(replacement, req.body, { requiredId: null });
replacement.validate().catch(function (err) {
// now I hit it
})
看來,當我構建模型的新實例時,sequelize不會驗證尚未設置的字段。
在續集中實現replace
函數的正確方法是什麼?舊實例應該替換爲包含必需字段的新對象以及任何可選字段的顯式值或默認值。
var original = { locationId: 1, requiredId: 2, someAttribute: 'foo'};
var new = { locationId: 1, requiredId: 3};
models.location.replace(new);
// => { locationId: 1, requiredId: 3, someAttribute: 'baz' }