2014-11-08 7 views
6

Ich versuche, 3 Tabellen zusammen Products, Suppliers und Categories und dann Zeile mit SupplierID = 13 zu bekommen. Ich habe How to implement many to many association in sequelize gelesen, dort wird erklärt, wie man 0:M assoziiert.Sequelize Verbände - bitte verwenden Sie Versprechen-Stil stattdessen

DB Modell: enter image description here

Code:

var Sequelize = require('sequelize') 
var sequelize = new Sequelize('northwind', 'nodejs', 'nodejs', {dialect: 'mysql',}) 
var Project = require('sequelize-import')(__dirname + '/models', sequelize, { exclude: ['index.js'] }); 

Project.Suppliers.hasMany(Project.Products, {foreignKey: 'SupplierID'}); 
Project.Products.belongsTo(Project.Suppliers, {foreignKey: 'SupplierID'}); 
Project.Categories.hasMany(Project.Products, {foreignKey: 'CategoryID'}); 
Project.Products.belongsTo(Project.Categories, {foreignKey: 'CategoryID'}); 

Project.Products 
    .find({ 
     where: { 
      SupplierID: 13 
     }, 
     include: [ 
      Project.Suppliers, 
      Project.Category, 
     ] 
    }) 
    .success(function(qr){ 
     if (qr == null) throw "Err"; 

     console.log("---"); 
     console.log(qr); 
    }) 
    .error(function(err){ 
     console.log("Err"); 
    }); 

Log:

EventEmitter#success|ok is deprecated, please use promise-style instead. 
    EventEmitter#failure|fail|error is deprecated, please use promise-style instead. 
    Err 

Antwort

33

Update: 15. Januar 15 - hinzugefügt .finally() Handler. Außerdem wird angegeben, wie mit einem Argument vom vorherigen Handler gespeist wird und wie die nächste sequenzielle Abfrage durchgeführt wird. Die .success, .error und .done Handler sind veraltet. Die Fehler sind nicht kritisch und es ist wahrscheinlich, dass die Abwärtskompatibilität bei ihnen aufrechterhalten wird. Aber du solltest es immer noch ändern.

Wie pro Versprechen A Spezifikationen: http://wiki.commonjs.org/wiki/Promises/A

Sie sollten nun die folgenden Stil tun:

db.Model.find(something) 
    .then(function(results) { 
     //do something with results 
     //you can also take the results to make another query and return the promise. 
     return db.anotherModel.find(results[0].anotherModelId);   
    }).then(function(results) { 
     //do something else 
    }).catch(function(err) { 
     console.log(err); 
    }).finally(function() { 
     // finally gets called always regardless of 
     // whether the promises resolved with or without errors. 
     // however this handler does receive any arguments. 
    }); 

Kurz:

Verwenden .then statt .success

Verwenden .catch statt .error

Verwenden Sie .finally anstelle von .done * Hinweis: .finally wird immer unabhängig aufgerufen.

+0

Eigentlich wäre 'endlich' ein besserer Ersatz für' done', da es unabhängig vom Erfolg aufgerufen wird oder nicht. Aber es hat keinen Zugriff weder auf Fehler noch das Ergebnis –

+0

Danke :) funktioniert wie es sollte! –

+0

Das sieht cool aus, aber ich benutze Eclipse (nodelipse) und es zeigt mir Kompilierungsfehler bei der Verwendung von .Catch (Der Fehler sagt: "Syntaxfehler auf Token" catch ", Identifier erwartet"). Wie vermeide ich diesen Fehler? –

1

ich mit Ihnen das gleiche Problem hatten, können Sieändernund .error mit einzelnen .done(function(err, result)) zu tun, beide Operationen und die Warnmeldung verschwinden auch.

+0

['Done' ist auch veraltet] (https://github.com/sequelize/sequelize/wiki/Upgrading-to-2.0) – Domi

+0

Auch dies ist ein klassisches Versprechen Anti-Muster: https://github.com/pekaantonov/bluebird/wiki/Promise-Anti-Muster # the-thensuccess-fail-anti-Muster – sethreidnz

Verwandte Themen