2017-05-21 9 views
0

これは愚かな質問のビットであるが、私は2つのAPIエンドポイントとそのような基本的なSequelizeモデルがある場合があります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を送信した場合どうなりますかリクエスト(それぞれに1つ)? 1つは他を上書きするでしょうか?もしそうなら、twoにはsomeFieldを設定せず、その代わりにotherFieldを変更して保存してください。 oneに設定されたデータは失われますか?

データがオーバーライドされている場合、他のリクエストで送信されたデータを上書きせずに、dataなどのフィールドを更新してSequelizeインスタンスで処理することをお勧めしますか?

+0

私は、これはデータベースはJSONデータへの変更をどのように扱うかに依存推測するが、私はそれがだと思います自分自身をテストするのが比較的簡単である(または、Sequelizeが各タイプのアップデートに対して実行されるクエリを確認して確認する)。 – robertklep

答えて

0

はい、ルートtwoのデータフィールド全体を上書きしています。someFieldが失われます。

私はinstance.set()は、ドットシンタックスを通じて、ネストされたフィールドの更新をサポートしている知っているように、あなたはこのようにすることを使用する必要があります。

user.set('data.otherField', 'updated it'); 
user.save() 
関連する問題