这可能是
一个有点愚蠢的问题,但是如果我有 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 Instance并更新字段(如data
(而不覆盖其他请求中发送的数据?
是的,您正在覆盖路由two
中的整个数据字段,someField
将丢失。
据我所知instance.set()
通过点语法支持嵌套字段更新,您应该以这种方式使用它:
user.set('data.otherField', 'updated it');
user.save()