Node.js / Sequelize.js / Express.js - Wie legen Sie in viele-zu-viele-Assoziation? (sync/async?)
Ich habe zwei Modelle (Einzel -, E-Mail) und versuche zum einfügen in die erstellten 'Individual_Email' Tabelle mit den Sequelize Befehle. Während Sequelize ist, das die gewünschte Tabelle, gibt es den folgenden Fehler beim hinzufügen/get - /set-an/aus dieser Tabelle: "Objekt [Objekt-Versprechen] hat keine Methode 'addEmail'". Was bin ich?
Den Sequelize Dokumentation sagt, wenn die Modelle sind User und Projekt, "Das wird hinzufügen von Methoden getUsers, setUsers, addUsers zu Projekt, und getProjects, setProjects und addProject zu User".
Dies führt mich zu glauben, (auf der Suche bei Versprechen), dass ich wahrscheinlich bin Missverständnis, wie die Verwendung der asynchronen Funktionen der Knoten. Ich habe versucht, sowohl eine synchrone und asynchrone version der Aufnahme, sowohl Rücksendung die gleiche Meldung oben.
Sequelize Dokumentation: http://docs.sequelizejs.com/en/latest/docs/associations/
Code:
routes/index.js
var express = require('express');
var router = express.Router();
var models = require('../models');
/* GET home page. */
router.get('/', function(req, res, next) {
'use strict';
var tIndividual, tEmail;
tIndividual = models.Individual.create({
name: "Test"
});
tEmail = models.Email.create({
address: "[email protected]"
});
console.log(tEmail);
res.render('index', { title: 'Express' });
});
module.exports = router;
ODER
/* GET home page. */
router.get('/', function(req, res, next) {
'use strict';
var tIndividual, tEmail;
tIndividual = models.Individual.create({
name: "Test"
}).then(function(){
tEmail = models.Email.create({
address: "[email protected]"
}).then(function(){
tIndividual.addEmail(tEmail).then(function(){
console.log("Success");
});
})
});
res.render('index', { title: 'Express' });
});
module.exports = router;
models/index.js
db.Individual.hasMany(db.Email, {
as: 'Email',
through: 'Individual_Email'
});
db.Email.hasMany(db.Individual, {
as: 'Individual',
through: 'Individual_Email'
});
Wie kann ich hinzufügen, um die Tabelle 'Individual_Email' in der beste Weg? Ich gehe davon aus, dass ich brauchen, um es synchron zu warten, für das update, aber ich bin offen für alle Vorschläge. Danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim Aufruf
.save()
oder.create()
oder andere Methoden, die Rendite Versprechen, sollten Sie rufen.then()
auf dieses Versprechen. Wenn Sie verrechnet wird, -- das heißt, wenn das Objekt gespeichert wird/erstellt/etwas-elsed-Ihrethen
- Funktion wird aufgerufen werden, und erhalten die gespeichert/erzeugt Objekt als parameter.So Ihre erste Versuch kann wie folgt umgeschrieben werden:
Den obigen code fehlt ein paar wichtige Dinge, wie
return
ing Versprechungen für eine bessere Verkettung und die Fehlerbehandlung, aber es ist ein Anfang. Ich würde empfehlen, Bluebird Dokumentation auf die Materie (das ist das Versprechen, Bibliothek, Sequelize verwendet, aber es gibt mehrere andere)hasMany
. So gibt es drei Tabellen, in der das Ende (E-Mails, Personen, und EmailIndividual). Der obige code wird in der Praxis generieren drei INSERT-Anweisungen, und Sie können nicht weniger als das, denn es sind drei Tabellen zu füllen.Können Sie mildern die "Pyramid of Doom" mit Versprechungen der beste Weg:
Ich herausgefunden, wie zu lösen, es in einer Art und Weise, aber lassen Sie mich wissen, ob es einen besseren Weg.
Meine Lösung:
Da .create() zurückgegeben ein Versprechen, die ich stattdessen verwendet .build() die zurückgegebenen Instanz, und nur Hinzugefügt, um 'Individual_Email' nach den beiden gerettet worden waren synchron. Ich rief dann die add-Methode auf die Instanz zurückgegeben aus .build() und in die Tabelle eingefügt.
Mein code: