【问题标题】:Sequelize Instance method save() concurrency behaviourSequelize Instance 方法 save() 并发行为
【发布时间】:2017-05-21 07:26:36
【问题描述】:

这可能是一个有点愚蠢的问题,但如果我有 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)的推荐方法是什么?

【问题讨论】:

  • 我想这取决于数据库如何处理对 JSON 数据的更改,但我认为自己测试会相对容易(或检查并查看 Sequelize 为每种更新类型运行哪些查询)。

标签: javascript node.js express sequelize.js


【解决方案1】:

是的,您正在覆盖路由 two 中的整个数据字段,someField 将丢失。

据我所知instance.set() 支持通过点语法更新嵌套字段,您应该这样使用它:

user.set('data.otherField', 'updated it');
user.save()

【讨论】:

    猜你喜欢
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-16
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    相关资源
    最近更新 更多