Node.js / Sequelize.js / Express.js – 如何插入到多对多的关联? (同步/asynchronous?)

我有两个模型(个人,电子邮件),并试图使用Sequelize命令插入创build的“Individual_Email”表。 虽然Sequelize正在创build所需的表,但在尝试从该表添加/获取/设置时会返回以下错误:“Object [object promise]'没有方法'addEmail'”。 我错过了什么?

Sequelize文档说如果模型是用户和项目,“这将添加方法getUsers,setUsers,addUsers到项目和getProjects,setProjects和addProject到用户。

这使我相信(看许诺),我很可能误解了如何使用Node的asynchronousfunction。 我已经尝试了插入的同步和asynchronous版本,都返回上面相同的消息。

续集文档: http ://docs.sequelizejs.com/en/latest/docs/associations/

码:

路线/ 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: "test@gmail.com" }); console.log(tEmail); res.render('index', { title: 'Express' }); }); module.exports = router; 

要么

 /* 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: "test@gmail.com" }).then(function(){ tIndividual.addEmail(tEmail).then(function(){ console.log("Success"); }); }) }); res.render('index', { title: 'Express' }); }); module.exports = router; 

车型/ index.js

 db.Individual.hasMany(db.Email, { as: 'Email', through: 'Individual_Email' }); db.Email.hasMany(db.Individual, { as: 'Individual', through: 'Individual_Email' }); 

我怎样才能以最好的方式添加到“Individual_Email”表中? 我假设我需要做同步等待更新,但我打开任何build议。 谢谢!

当您调用.save().create()或其他返回Promise的方法时,应该在该promise上调用.then() 。 当它parsing – 也就是说,当对象被保存/创build/删除 – 你的函数将被调用,并将接收保存/创build的对象作为参数。

所以你的第一次尝试可以改写为:

 models.Individual.create({ name: "Test" }).then(function(createdIndividual) { // note the argument models.Email.create({ address: "test@gmail.com" }).then(function(createdEmail) { // note the argument createdIndividual.addEmail(createdEmail) .then(function(addedEmail) { // note th-- well you get the idea :) console.log("Success"); }); }) }); 

上面的代码缺less一些重要的东西,例如return更好的链接和error handling的承诺,但这是一个开始。 我推荐Bluebird的文档 (这是Sequelize使用的Promise库,但还有其他几个)

你可以用最好的方式来减轻“ 末日金字塔

 var createdIndividual; models.Individual.create({ name: "Test" }).then(function(createdIn) { // note the argument createdIndividual = createdIn; return models.Email.create({ address: "test@gmail.com" }); }).then(function(createdEmail) { // note the argument return createdIndividual.addEmail(createdEmail); }).then(function(addedEmail) { // note th-- well you get the idea :) console.log("Success"); }); 

问候,Nicholls

我想出了如何以一种方式解决问题,但让我知道是否有更好的方法。

我的解决scheme:由于.create()返回一个承诺,我反而使用.build()返回一个实例,并且只有在两个同步保存后添加到'Individual_Email'。 然后我从.build()返回的实例上调用add方法,并插入到表中。

我的代码:

 var tIndividual, tEmail; tIndividual = models.Individual.build({ name: "Test" }); tEmail = models.Email.build({ address: 'test@gmail.com' }); tIndividual.save() .success(function(){ tEmail.save() .success(function(){ tIndividual.addEmail(tEmail); }); });