许多与许多人的关系:无法阅读财产'分裂'未定义的

时间:2016-08-15 05:18:31

标签: mysql node.js sequelize-cli

我尝试使用Sequelize + nodeJs使用现有的MySQL数据库创建多对多的关系:

以下是我的表格:   - " usr"表:usr_id(PK)   - 中级" usr_role" :usr_id,role_id   - "角色" table:role_id

这是我的模特 "用户"机型:



"use strict";
var bcrypt = require('bcryptjs');

 module.exports = function(sequelize, DataTypes) {

  var User = sequelize.define('User', {
    usrid  : {
        type: DataTypes.INTEGER,
        primaryKey: true,
        autoIncrement: true,
        allowNull: false,
        field:'usr_id'
    },
    name :{
        type: DataTypes.STRING,
        allowNull: false,
        field:'usr_name'
    },

  }, {
    timestamps: false,
    freezeTableName: true,
    tableName: 'usr',
    name:'User',
    underscored:'true',

    classMethods: {
      associate:function(models){
        User.belongsToMany(models.Role, { through: 'UserRole', foreignKey:'usr_id', as:'UserRoles'});
      }

    }
  }
);
  return User;
};




"作用"模型



module.exports = function(sequelize, DataTypes) {
var Role = sequelize.define('Role', {
  id  : {
      type: DataTypes.INTEGER,
      primaryKey: true,
      autoIncrement: true,
      allowNull: false,
      field:'role_id'
  },
  name :{
      type: DataTypes.STRING,
      allowNull: false,
      field:'role_name'
  },

},{
  timestamps: false,
  freezeTableName: true,
  tableName: 'role_ref',
  underscored:'true',

  classMethods: {
    associate:function(models){
      Role.belongsToMany(models.User, {
        through: 'UserRole',
        foreignKey:'role_id'});
     }
  }
}
)
return Role;
};




E:\nodejsWS\learn\node_modules\inflection\lib\inflection.js:795
var str_path = str.split( '::' );
                    ^
TypeError: Cannot read property 'split' of undefined
at Object.inflector.underscore 
(E:\nodejsWS\learn\node_modules\inflection\lib\inflection.js:795:25)
at Object.module.exports.underscoredIf 
(E:\nodejsWS\learn\node_modules\sequelize\lib\utils.js:28:27)
at new BelongsToMany (E:\nodejsWS\learn\node_modules\sequelize
\lib\associations\belongs-to-many.js:134:15)
at Mixin.belongsToMany 
(E:\nodejsWS\learn\node_modules\sequelize\lib\associations
\mixin.js:264:21)
at sequelize.define.classMethods.associate 
(E:\nodejsWS\learn\models\Role.js:29:12)
at E:\nodejsWS\learn\models\index.js:50:21

这是我的index.js



// Import models
  fs
    .readdirSync(__dirname)
    .filter(function(file) {
      return (file.indexOf(".") !== 0) && (file !== "index.js");
    })
    .forEach(function(file) {
      var model = sequelize.import(path.join(__dirname, file));
      db[model.name] = model;
    });

//associate models
  Object.keys(db).forEach(function(modelName) {
    if ("associate" in db[modelName]) {
      console.log(db);
      db[modelName].associate(db);
    }
  });




第50行引用导致错误的db [modelName] .associate(db)。

有人可以指导我做错了什么。我是否需要手动创建中间模型' UserRole'。非常感激您的帮忙。感谢。

1 个答案:

答案 0 :(得分:0)

您需要在belongsToMany配置中指定实际的中间表名称,或者定义模型UserRole。此外,除非您的中间表包含字段,否则您可能还需要指定timestamps: false。所以,例如:

Role.belongsToMany(models.User, {
    through: 'usr_role',
    foreignKey:'role_id',
    timestamps: false
});

这将导致sequelize在其构建的查询中使用该表而无需定义模型,并且将阻止它从User表或中间层请求时间戳字段。