续集多对多关联:getter / setter方法不存在

时间:2018-01-05 03:42:57

标签: node.js postgresql many-to-many sequelize.js

你在做什么?

我试图在两个表之间创建多对多关系:'路由'和'标签'。但是,当我尝试使用sequelize创建的getter方法时,我会收到一条错误,说它不是一种方法。

我的模型定义如下:

模型/路由:

module.exports = (sequelize, DataTypes) => {
  var route = sequelize.define('route', {
    name: {
//some attributes
  }, {
    classMethods: {
      associate: function(models) {
        route.belongsToMany(models.tag, { through: models.route_tag, as: 'tag' })
      }
    }
  });
  return route;
};

模型/标签

module.exports = (sequelize, DataTypes) => {
  var tag = sequelize.define('tag', {
//some attributes
  }, {
    classMethods: {
      associate: function(models) {
        tag.belongsToMany(models.route, { through: models.route_tag, as: 'route' })
      }
    }
  });
  return tag;
};

模型/ route_tag:

module.exports = (sequelize, DataTypes) => {
  var route_tag = sequelize.define('route_tag', {
    name: DataTypes.STRING,
    route_id: DataTypes.INTEGER,
    tag_id:DataTypes.INTEGER
  })
  return route_tag;
};

我试图访问以下种子文件中的getter方法:

const route = require('../models').route
const tag = require('../models').tag


module.exports = {
  up: (queryInterface, Sequelize) => {
    return route.findOne({where:{name:'routeName'}}).then(myRoute=>{
      return route.findOne({where:{name:'crackName'}}).then(myTag=>{
        return myRoute.addTag(myTag)
      })
    })
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.bulkDelete('route_tags')
  }
};

您期望发生什么?

从我在文档和各种教程/论坛中读到的内容,我的印象是在路由和标记模型中设置的belongsToMany关联会自动将addTag方法添加到路由的实例中,并且addRoute方法到标记的实例。

实际发生了什么?

当我尝试运行种子文件时,我收到错误消息:

  

错误:myRoute.addTag不是函数

我觉得我必须按照我宣布关联的方式在某处发生错误,但我一直在将我的代码与文档以及我在网上找到的其他示例进行比较(最值得注意的是这一个:https://codeburst.io/sequelize-migrations-setting-up-associations-985d29b61ee7),我无法找到错误的位置。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

您正试图访问种子文件中的sequelize模型方法,并且当时关联不会被初始化。

如果通过指定外键从findOne查询获取数据,则可以使用queryInterface.bulkInsert()