Node/Sequelize仅加载Item模型:多模型未加载原因排查
问题根源:所有模型都重复使用了相同的模型名称
"Item" 你遇到的问题其实非常直观——仔细检查你的模型文件代码,就能发现artisan.js、store.js、itemStore.js这三个文件,在调用sequelize.define()时,都错误地把第一个参数写成了"Item",而不是各自对应的模型名称(比如"Artisan"、"Store"、"ItemStore")。
为什么会导致模型丢失?
看一下./models/index.js里加载模型的核心逻辑:
var model = sequelize['import'](path.join(__dirname, file)); db[model.name] = model;
这里的model.name就是你在define()中传入的第一个参数。当多个模型都使用"Item"作为名称时,后加载的模型会直接覆盖之前加载的同名模型,最终db对象里就只剩下最后一个被加载的Item模型(也就是你自己写的item.js里的模型),其他三个模型都被冲掉了。
修正方案:给每个模型设置唯一的名称
只需要修改每个模型文件里sequelize.define()的第一个参数,改成和模型对应的名称即可:
1. 修正./models/artisan.js
module.exports = function (sequelize, DataTypes) { var artisan = sequelize.define("Artisan", { // 把"Item"改成"Artisan" name: DataTypes.STRING, email: DataTypes.STRING, website: DataTypes.STRING, phoneNumber: DataTypes.INTEGER }); return artisan; };
2. 修正./models/store.js
module.exports = function (sequelize, DataTypes) { var store = sequelize.define("Store", { // 把"Item"改成"Store" name: DataTypes.STRING, addressLineOne: DataTypes.STRING, addressLineTwo: DataTypes.STRING, city: DataTypes.STRING, state: DataTypes.STRING, zip: DataTypes.INTEGER }); return store; };
3. 修正./models/itemStore.js
module.exports = function (sequelize, DataTypes) { var itemStore = sequelize.define("ItemStore", { // 把"Item"改成"ItemStore" itemId: DataTypes.INTEGER, storeId: DataTypes.INTEGER }); return itemStore; };
额外小提示
你的server.js里还有一个小笔误:
itemsStores(app, db); // 这里应该是itemStores(app, db),和你require的变量名一致
这个不影响模型加载,但会导致itemStores路由无法注册,建议一起修正。
修改完成后重启服务,再看console.log(Object.keys(db))的输出,就能看到所有模型都正常加载到db里了。
内容的提问来源于stack exchange,提问作者Kyle Joseph Green
相关产品推荐
相关产品推荐

