我最近一直在学习Node.JS,我现在正在使用Sequelize。 我有更新方法的问题;它更新得很好,但是当我输入应该与属性的数据类型不兼容的值时,它仍会传递它,并在数据库中更新它。
例如:在Postman中,当我尝试使用字符串更新记录的“completed”属性时,即使将数据类型指定为布尔值,它也会更新,并且不会传递任何错误消息(请求状态为200)。 这是代码:
todo模特:
module.exports = function (sequelInst, DataTypes){
return sequelInst.define('todo', {
description: {
type: DataTypes.STRING,
allowNull: false,
validate: {
len: [1, 250]
}
},
completed: {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: false
}
});
};
server.js:
...
app.put('/todos/:id', function(req,res){
var body =_.pick(req.body, 'description', 'completed');
var attributes = {};
var paramId = parseInt(req.params.id, 10);
if( body.hasOwnProperty('completed')){
attributes.completed = body.completed;
}
if( body.hasOwnProperty('description')) {
attributes.description = body.description;
}
db.todo.findById(paramId)
.then(function(todo){ // First Promise Chain
if(todo){
return todo.update(attributes);
}
else{
res.status(404).send("No todo corresponding to id");
}
}, function () {
res.status(500).send("Server Error");
})
.then(function(todo) { // Second Promise Chain
res.send(todo);
}, function (e){
res.status(400).json(e);
});
});
答案 0 :(得分:3)
Instance.update不会根据类型进行验证。
由于您没有收到错误,您可能使用的是SQLite或其他存储,它们对数据库级别的类型没有严格的验证。
您需要添加自己的验证器。如果你这样做:
completed: {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: false,
validate: {
isBoolean: true
}
}
您将收到以下错误:
Unhandled rejection SequelizeValidationError: Validation error: Validation isBoolean failed
但是,不推荐使用此验证:
validator *deprecated* you tried to validate a boolean but this library (validator.js) validates strings only. Please update your code as this will be an error soon. node_modules/sequelize/lib/instance-validator.js:276:33
这将有效:
var _ = require('lodash');
validate: {
isBoolean: function (val) {
if (!_.isBoolean(val)) {
throw new Error('Not boolean.');
}
}
}
会给你一个错误:
Unhandled rejection SequelizeValidationError: Validation error: Not boolean.