2016-08-15 2 views
1

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

Ниже мои таблицы: - «USR» Таблица: usr_id (PK) - Intermediate "usr_role": usr_id, ROLE_ID - "роль" таблицы: 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. Ваша помощь очень ценится. Благодарю.

ответ

0

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

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

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

+0

Спасибо, что ответили. Я попытался использовать ваше решение, но ошибка «TypeError: Невозможно прочитать свойство« split »undefined» все еще существует. Я использую продолжение версии 3.23.6. благодаря – user4661864