Node.js / Sequelize.js / Express.js - Comment insérer dans plusieurs-à-plusieurs association? (sync/async?)
J'ai deux modèles (Individu, e-Mail) et j'essaie de l'insérer dans le créé " Individual_Email la table à l'aide de la Sequelize commandes. Alors que Sequelize est la création de la table désirée, elle retourne l'erreur suivante lorsque vous essayez d'ajouter/obtenir/de la/de ce tableau: "l'Objet [de l'objet de la Promesse] n'a pas de méthode 'addEmail'". Ce qui me manque?
La Sequelize la documentation dit que si les modèles sont d'Utilisateur et le Projet, "Cela va ajouter des méthodes getUsers, setUsers, addUsers de Projet, et getProjects, setProjects et addProject à l'Utilisateur."
Cela me mène à croire (promesses) que je suis susceptible de l'incompréhension comment utiliser les fonctionnalités asynchrones de Nœud. J'ai essayé à la fois synchrone et asynchrone version de l'insertion, tous deux de retour le même message que ci-dessus.
Sequelize Documentation: 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;
OU
/* 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'
});
Comment puis-je ajouter de la table 'Individual_Email' de la meilleure façon? Je suppose que j'ai besoin de le faire de manière synchrone à attendre la mise à jour, mais je suis ouvert à toutes suggestions. Merci!
OriginalL'auteur smileham | 2015-03-07
Vous devez vous connecter pour publier un commentaire.
Lorsque vous appelez
.save()
ou.create()
ou d'autres méthodes qui renvoient une Promesse, vous devriez appeler.then()
sur cette promesse. Quand elle se résout, -- c'est lorsque l'objet est enregistré/créé/quelque chose-elsed -- votrethen
fonction sera appelée, et recevra les sauvés ou créés objet en tant que paramètre.Si votre première tentative peut être réécrit comme suit:
Le code ci-dessus manque de quelques choses importantes, telles que
return
ing les promesses pour mieux le chaînage et la gestion des erreurs, mais c'est un début. Je le recommande Bluebird est de la documentation sur la question (c'est la Promesse de la bibliothèque qui Sequelize utilise, mais il y a plusieurs autres)Notez que cette association est N:M, puisque l'Individu et de l'e-Mail ont été configurés avec
hasMany
. Il y a donc trois tables en fin de compte (e-Mails, des Individus, et EmailIndividual). Le code ci-dessus, dans la pratique, de générer des trois états d'INSERTION, et vous ne pouvez pas obtenir moins que parce qu'il y a trois tableaux à remplir.Cela dit, une fois, j'ai eu une situation similaire, que j'ai résolu cette question: stackoverflow.com/questions/28751483/...
OriginalL'auteur st.never
Vous pouvez atténuer l' "Pyramide de Doom" à l'aide de promesses de la meilleure façon:
OriginalL'auteur jdnichollsc
J'ai compris comment le résoudre dans un sens, mais laissez-moi savoir si il ya une meilleure façon.
Ma solution:
Depuis .créer() a retourné une promesse, j'ai plutôt utilisé .build() qui retourne une instance, et seulement ajouté à 'Individual_Email" après les deux ont été sauvés de façon synchrone. J'ai alors appelé la méthode add sur l'instance retournée .build() et insérées dans la table.
Mon code:
Hey, Pouvez-vous addEmail lors de la construction de l'objet, avant qu'il soit créé? La raison pour laquelle je demande c'est que je wan pour s'assurer si tout insérez réussit allez-y sinon même pas la peine de créer quoi que ce soit dans n'importe quelle table
OriginalL'auteur smileham