2017-05-21 2 views
0

Dies könnte ein bisschen eine dumme Frage, aber wenn ich 2 API-Endpunkte haben und ein Grund Sequelize Modell wie folgt:Sequelize Instanz Methode save() Gleichzeitigkeit Verhalten

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') 
     }) 
}) 

Was passiert, wenn der gleiche Benutzer sendet 2 Anfragen (eins zu jedem)? Überschreibt der eine den anderen? Wenn ja, was passiert, wenn ich in twosomeField nicht setze und stattdessen einfach die otherField ändern und speichern. Wird der Datensatz one verloren gehen?

Wenn Daten überschrieben werden, wie wird empfohlen, mit Sequelize-Instanzen zu arbeiten und Felder wie data zu aktualisieren, ohne die in anderen Anforderungen gesendeten Daten zu überschreiben?

+0

Ich denke, das hängt davon ab, wie die Datenbank behandelt Änderungen JSON-Daten, aber ich denke, es wäre Es ist relativ einfach, sich selbst zu testen (oder zu überprüfen, welche Abfragen Sequelize für jeden Aktualisierungstyp ausführt). – robertklep

Antwort

0

Ja, Sie überschreiben das gesamte Datenfeld in der Route two, someField wird verloren gehen.

Wie ich weiß instance.set() verschachteltes Feld Updates durch Dot-Syntax unterstützt, sollen Sie, dass auf diese Weise verwenden:

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