问题
这周有个需求是使用 egg.js 接入 MongoDB 数据库,于是先按照官方推荐的方式使用 egg-mongoose,但是在按照文档进行操作写 demo 时出现了非常诡异的错误TypeError: Cannot read property 'Schema' of undefined
,app.mongoose
app 下的 mongoose
没有被正常挂载上。
// config/plugin.js
module.exports = {
... 省略其他不相关配置
mongoose: {
enable: true,
package: 'egg-mongoose',
},
};
// config/config.default.js
module.exports = appInfo => {
/**
* built-in config
* @type {Egg.EggAppConfig}
**/
const config = exports = {};
... 省略其他不相关配置
config.mongoose = {
client: {
url: 'mongodb://xxxx:30000',
options: {
mongos: true,
dbName: 'xxx',
user: 'xxx',
pass: 'xxx',
},
},
};
return {
...config,
};
}
// {app_root}/app/model/user.js
module.exports = app => {
const mongoose = app.mongoose;
const Schema = mongoose.Schema;
const UserSchema = new Schema({
userName: { type: String },
password: { type: String },
});
return mongoose.model('User', UserSchema);
}
排查思路
首先确认有没有拼写错误,没有的话直接用最小化方式使用 egg-mongoose 是否可以复现来确认是不是文档出现了问题。测试后发现正常。接下来就是排查本地代码,发现是由于 egg-sequelize
导致的,而部分业务接口之前配置了使用 MySQL 数据库。。 egg-sequelize
和 egg-mongoose
默认都是加载 app/model
下的文件,具体逻辑后续详说。
解决方法
看看是否可以修改插件的加载目录。
egg-mongoose
是不能配置的,源码里面写死了指定的 model 路径, egg-sequelize
是可以的。
config.sequelize = {
baseDir: 'my_model', // load all models to `app[delegate]` and `ctx[delegate]`, default to `model`
delegate: 'myModel', // load all models to `app[delegate]` and `ctx[delegate]`, default to `model`
dialect: 'mysql',
host: process.env.MYSQL_HOST,
port: 3306,
database: process.env.MYSQL_DATABASE
username: process.env.MYSQL_USER
password: process.env.MYSQL_PASSWORD
};
修改之前就没问题了,delegate
表示将 orm 挂载的位置,之前默认是 model
,修改完之后不要忘记业务代码中的已有代码(如this.ctx.model.xxx
=> this.ctx.myModel.xxx
)。
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!