Продолжить отношения "многие ко многим": не удается прочитать свойство 'split' неопределенного значения

Я пытаюсь создать отношения "многие ко многим", используя Sequelize + nodeJs, используя существующую базу данных MySQL:

Ниже приведены мои таблицы: - Таблица «usr»: usr_id (PK) - Промежуточная «usr_role»: usr_id, role_id - таблица «role»: 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. Ваша помощь очень ценится. Спасибо.


person user4661864    schedule 15.08.2016    source источник


Ответы (1)


Вам необходимо указать фактическое имя промежуточной таблицы в belongsToMany config или определить модель UserRole. Кроме того, если в вашей промежуточной таблице нет полей, вы, вероятно, также захотите указать timestamps: false. Так, например:

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

Это приведет к тому, что sequelize будет использовать эту таблицу в запросах, которые он строит, не требуя определения модели, и предотвратит запрос полей временной метки либо из таблицы User, либо из промежуточной.

person Will    schedule 16.08.2016
comment
Спасибо за ответ. Я попытался использовать ваше решение, но ошибка TypeError: Cannot read property 'split' of undefined все еще существует. Я использую сиквелиз версии 3.23.6. Спасибо - person user4661864; 18.08.2016