2016-03-17 65 views
0

最近我一直在學習Node.JS,目前我正在使用Sequelize。 我有更新方法的問題;它更新得很好,但是當我輸入應該與屬性的數據類型不兼容的值時,它仍然會傳遞它,並在數據庫中更新它。例如:在Postman中,當我嘗試用字符串更新記錄的「已完成」屬性時,即使數據類型被指定爲布爾值,並且沒有提供錯誤消息(請求狀態爲200),它也會被更新。 下面是代碼:未驗證的Sequelize DataTypes

  • 待辦事項模型:

    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); 
         }); 
    
        }); 
    

回答

2

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.