2016-08-15 19 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

相關問題