2016-08-02 23 views
1

Verwenden von sequelize.js mit express.js.Wie erstelle ich einen Ersetzungsvorgang mit sequelize.js?

Ich muss eine vorhandene Instanz eines Modells durch eine neue Instanz ersetzen. Ich möchte, dass die neue Instanz vor dem Speichern der Ersetzung validiert wird, um sicherzustellen, dass alle erforderlichen Felder vorhanden sind. Allerdings funktioniert validate() nicht so, wie ich es erwarten würde. Im folgenden Beispiel fehlt req.bodyrequiedId. Ich erstelle eine neue location, setzen someAttribute darauf von req.body und rufen . Da requiredId fehlt und das Modell es als allowNull: false definiert hat, würde ich einen Validierungsfehler erwarten. Dies ist nicht der Fall, und das Update läuft glücklich.

sequelize.define('location', { 
locationId: { 
    type: DataTypes.STRING, 
    allowNull: false, 
    primaryKey: true, 
}, 
requiredId: { 
    type: DataTypes.INTEGER, 
    allowNull: false, 
}, 
someAttribute: { 
    type: DataTypes.STRING, 
    defaultValue: 'baz' 
}); 

var location; 
models.location.findById(locationId) 
    .then(function (data) { 
     location = data; 
     var replacement = models.location.build({}); 

     // req.body = { someAttribute: 'value' } 
     _.assign(replacement, req.body); 

     return replacement.validate() 
      .then(function() { 
       return location.update(replacement.toJSON()); 
      }); 
    } 
}) 
.then(function() { 
    res.send('success'); 
}) 
.catch(function (err) { 
    res.status(400).send({ error:err }); 
}); 

Wenn ich manuell einen null Wert für requiredId hinzufügen, dann tritt der Fehler bei der Überprüfung, wie erwartet.

_.assign(replacement, req.body, { requiredId: null }); 
replacement.validate().catch(function (err) { 
    // now I hit it 
}) 

Es scheint, dass, wenn ich eine neue Instanz eines Modells bin Gebäude, sequelize keine Felder nicht bestätigen, die nicht festgelegt worden sind.

Was ist der richtige Weg, um eine replace Funktion in Sequelize zu implementieren? Die alte Instanz sollte durch ein neues Objekt ersetzt werden, das die erforderlichen Felder und entweder einen expliziten Wert oder den Standardwert für optionale Felder enthält.

var original = { locationId: 1, requiredId: 2, someAttribute: 'foo'}; 
var new = { locationId: 1, requiredId: 3}; 
models.location.replace(new); 
// => { locationId: 1, requiredId: 3, someAttribute: 'baz' } 

Antwort

0

Stellt sich heraus, ich war verwirrt darüber, wie die validate() Anruf funktioniert. Ich erwartete, dass alle Validierungsfehler bis zum catch() Teil des Versprechens fallen würden. Wenn Sie jedoch direkt validate() aufrufen, werden Validierungsfehler im Callback-Argument zurückgegeben.