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

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

Sequelize文档说如果模型是User和Project,“这将把方法getUsers,setUsers,addUsers添加到Project,getProjects,setProjects和addProject添加到User.”

这让我相信(看看承诺)我可能误解了如何使用Node的异步功能.我已经尝试了同步和异步版本的插入,两者都返回上面相同的消息.

Sequelize文档: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('/',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’?我假设我需要同步地等待更新,但我愿意接受任何建议.谢谢!

解决方法

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

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

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");
      });
  })
});

上面的代码缺少一些重要的东西,比如返回promises以获得更好的链接错误处理,但这是一个开始.我建议Bluebird’s documentation(这是Sequelize使用的Promise库,但还有其他几个)

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...