控制器为Sequelize多对多关系

时间:2018-04-08 19:04:12

标签: javascript sequelize.js

我在Sequelize中有一个控制器用于多对多表。以前,我的控制器看起来像这样:

const Card = require('../models').card;
const Tag = require('../models').tag;
const CardTag = require('../models').card_tag;

module.exports = {
  create(req, res) {
    Promise.all([
      Card.create({title: req.body.card.title, link: req.body.card.link}),
      Tag.create({title: req.body.tag.title})
    ])
      .then(([Card, Tag]) => CardTag.create({cardId: Card.id, tagId: Tag.id}))
      .catch(error => res.status(400).send(error));
  }

但是,我现在正在构建我的控制器,以便它可以处理单个卡和一组标签。但是,当我尝试创建此控制器时,我尝试在连接表中创建一行时返回某些未定义的值(tag.id)。我该怎么做呢? (请参阅下面的代码)。谢谢!

const Card = require('../models').card;
const Tag = require('../models').tag;
const CardTag = require('../models').card_tag;

module.exports = {
  create(req, res) {
    Promise.all([
      Card.create({title: req.body.card.title, link: req.body.card.link}),
      req.body.tags.map(tag =>
        Tag.create({title: tag.title})
      )
    ])
      .then(([Card, Tags]) =>
        // How do I properly create a row in the CardTag table? I am having 
        // difficulty getting back tag.id and am right now just returning 
        // an undefined value.
        Tags.map(tag =>
          CardTag.create({cardId: Card.id, tagId: tag.id})
        )
      )
      .catch(error => res.status(400).send(error));
  }
};

1 个答案:

答案 0 :(得分:1)

您的代码中的问题是Promise.all中的循环,因为它没有返回任何内容,这就是为什么您没有在.then()中获得结果

您可以bulkCreate使用create而非Tag

module.exports = {
  create(req, res) {
    Promise.all([
        Card.create({title: req.body.card.title, link: req.body.card.link}),
        Tag.bulkCreate(req.body.tags); // <------- Make Change Here --------
    ])
    .then(([Card, Tags]) =>
        Tags.map(tag =>
            CardTag.create({cardId: Card.id, tagId: tag.id})
        )
    )
    .catch(error => res.status(400).send(error));
  }
};