续集实例方法 save() 并发行为


这可能是

一个有点愚蠢的问题,但是如果我有 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()

最新更新