Sequelize DataTypes未经过验证

时间:2016-03-17 19:15:36

标签: node.js validation types sequelize.js

我最近一直在学习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);
          });
    
        });
    

1 个答案:

答案 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.