2017-05-21 63 views
0

這可能是一個有點愚蠢的問題,但如果我有2個API端點和基本Sequelize模型像這樣:Sequelize實例方法Save()併發行爲

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實例和更新字段(如data)的推薦方式是什麼,而不會覆蓋其他請求中發送的數據?

+0

我想這取決於數據庫如何處理變化的JSON數據,但我認爲它會比較容易測試自己(或者檢查並查看Sequelize針對每種更新類型運行的查詢)。 – robertklep

回答

0

是的,你是覆蓋在路線twosomeField將丟失整個數據字段。

據我所知instance.set()通過點語法支持嵌套的現場更新,你應該使用這種方式:

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