这可能是一个有点愚蠢的问题,但如果我有2个API端点和基本的Sequelize模型,那么:
var User = storage.database.define('user', {
email: {
type: sql.STRING,
validate: {
isEmail: true,
},
},
data: sql.JSON,
}, {
freezeTableName: true,
timestamps: true,
hooks: {
beforeUpdate: user => {
user.set('data', user.data)
},
},
})
function getUser(email) {
return User.findOne({
where: { email },
}).then(function(user) {
if (!user) {
throw {error: 'Unknown User'}
}
return user
})
}
api.get('/one/:email', function(req, res, next) {
getUser(req.params.email)
.then(user => {
user.data.someField = 1234;
setTimeout(() => {
user.save()
}, 1000)
res.send('one')
})
})
api.get('/two/:email', function(req, res, next) {
getUser(req.params.email)
.then(user => {
// update a different data field and/or the same field as in `one`
user.data = { otherField: 'updated it', someField: 9999 };
user.save()
res.send('two')
})
})
如果同一个用户发送2个请求(每个请求一个),会发生什么?一个会超越另一个吗?如果是这样,如果在two
我没有设置someField
而只是更改otherField
并保存它会发生什么。 one
中的数据集会丢失吗?
如果数据被覆盖,建议使用Sequelize Instances和更新data
等字段而不覆盖其他请求中发送的数据的方式是什么?
答案 0 :(得分:1)
是的,您要覆盖路线two
中的整个数据字段,someField
将会丢失。
据我所知instance.set()
通过点语法支持嵌套字段更新,您应该以这种方式使用它:
user.set('data.otherField', 'updated it');
user.save()