Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js/Sequelize.js/Express.js-如何插入多对多关联?(同步/异步?)_Javascript_Node.js_Promise_Sequelize.js - Fatal编程技术网

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

Javascript Node.js/Sequelize.js/Express.js-如何插入多对多关联?(同步/异步?),javascript,node.js,promise,sequelize.js,Javascript,Node.js,Promise,Sequelize.js,我有两个模型(个人,电子邮件),我正试图使用Sequelize命令插入到创建的“个人电子邮件”表中。Sequelize在创建所需的表时,在尝试向该表添加/获取/设置时返回以下错误:“Object[Object Promise]没有“addEmail”方法。我错过了什么 Sequelize文档说,如果模型是User和Project,“这将向Project添加方法getUsers、setUsers、addUsers,以及向User添加方法getProjects、setProjects和addProj

我有两个模型(个人,电子邮件),我正试图使用Sequelize命令插入到创建的“个人电子邮件”表中。Sequelize在创建所需的表时,在尝试向该表添加/获取/设置时返回以下错误:“Object[Object Promise]没有“addEmail”方法。我错过了什么

Sequelize文档说,如果模型是User和Project,“这将向Project添加方法getUsers、setUsers、addUsers,以及向User添加方法getProjects、setProjects和addProject。”

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

续集文档:

代码:

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: "test@gmail.com"
    });
    console.log(tEmail);

    res.render('index', { title: 'Express' });
});

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

models/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;
db.Individual.hasMany(db.Email, {
    as: 'Email',
    through: 'Individual_Email'
});
db.Email.hasMany(db.Individual, {
    as: 'Individual',
    through: 'Individual_Email'
});

如何以最佳方式将“个人电子邮件”添加到表中?我假设我需要同步进行,以等待更新,但我愿意接受任何建议。谢谢

我找到了一种解决方法,但如果有更好的方法,请告诉我

我的解决方案: 由于.create()返回了一个承诺,因此我使用了.build(),它返回了一个实例,并且只有在同步保存了这两个实例之后才添加到“个人电子邮件”中。然后,我对从.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);
        });
});
当您调用
.save()
.create()
或其他返回承诺的方法时,您应该调用该承诺的
.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");
      });
  })
});
上面的代码缺少一些重要的东西,例如
返回
对更好的链接和错误处理的承诺,但这只是一个开始。关于这一点,我推荐(这是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");
});

可能最好是将thens链接起来,而不是无缘无故地嵌套它们。嘿,在实际创建对象之前,您可以在构建对象时添加邮件吗?我问的原因是我想确定整个插入是否成功,否则甚至不用在任何表格中创建任何内容。在一次创建电子邮件时,您可以添加吗?与先创建然后添加邮件不同?@Mortezashahrarinia注意,这种关联是N:M,因为个人和电子邮件都配置了
hasMany
。因此,最后有三个表(电子邮件、个人和个人电子邮件)。实际上,上面的代码将生成三个INSERT语句,您不能得到少于这三个语句,因为有三个表要填充。@Mortezashahrarinia说,我曾经遇到过一个类似的情况,我在这个问题中解决了这个问题: