2016-08-02 3 views
1

Использование sequelize.js с express.js.Как создать операцию замены с помощью sequelize.js?

Мне нужно заменить существующий экземпляр модели новым экземпляром. Я хочу, чтобы новый экземпляр был проверен до сохранения замены, чтобы убедиться, что все необходимые поля присутствуют. Однако validate() не работает, как я ожидал. В следующем примере отсутствует req.bodyrequiedId. Я создаю новый location, установил someAttribute на нем от req.body и позвонил 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' } 

ответ

0

Оказывается, я был смущен о том, как вызова работ по validate(). Я ожидал, что любые ошибки проверки пройдут до части обещания. Однако при непосредственном вызове validate() ошибки валидации возвращаются в аргументе обратного вызова.

Смежные вопросы