2016-08-02 31 views
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 }); 
}); 

如果我手動添加nullrequiredId,然後按預期發生驗證錯誤。

_.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' } 

回答

0

原來我很困惑validate()調用的工作原理。我預計任何驗證錯誤都會落在承諾的catch()部分。但是,直接調用validate()時,驗證錯誤會在回調參數中返回。