Sequelize Instance方法save()并发行为

时间:2017-05-21 07:26:37

标签: javascript node.js express sequelize.js

这可能是一个有点愚蠢的问题,但如果我有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等字段而不覆盖其他请求中发送的数据的方式是什么?

1 个答案:

答案 0 :(得分:1)

是的,您要覆盖路线two中的整个数据字段,someField将会丢失。

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

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