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