2016-08-15 51 views
1

我试图创造出很多使用现有的MySQL数据库使用Sequelize +的NodeJS一对多的关系:Sequelize多对多的关系:无法读取属性“分裂”的未定义

下面是我的表: - “USR”表:usr_id(PK) - 中级 “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:无法读取未定义的属性”拆分“仍然存在。我使用的是3.23.6的续集版本。谢谢 – user4661864

相关问题