egg-sequelize和egg-mongoose两个插件怎么样才同时使用?
我现在发现egg-mongoose会去自动加载非mongodb的model,从而造成报错。
什么场景会同时使用两个?
有时候一些日志数据啥的,或者用户session啥的可能用的就是mongoose,其它重要的数据用的就是mysql了。
看来没有 model 插件之前都放在 model 目录下不是很好,暂时支持自定义目录吧?
可以支持的啊,可以配置
两个插件都可以配置 modelDir的,但是主要的问题是 app.model 可能会冲突,如果真的要用的话,model名字不要起一样的
@jtyjty99999 现在不支持,你来接单吧
这两个插件,如果app/model下面建了子目录,子目录下面有mode类,会不会加载?
应该默认支持的
egg-sequelize 的 modelDir 和 app.model 都不可自定义,我来改下
@denghongcai 👍 我记错了,以为以前还支持的
@denghongcai 这个什么时候能调好,还准备自己fork一份代码调了。
@arden 着急你就直接发 PR 来改嘛
@arden 你现在直接配置 egg-mongoose 的 modelDir 就能跑起来啊,我们只是在支持 egg-sequelize
egg-mongoose 也发布了
@arden 你现在直接配置 egg-mongoose 的 modelDir 就能跑起来啊,我们只是在支持 egg-sequelize
@jtyjty99999 请问,你说的现在这个支持吗?就是用egg-sequelize什么都不动,然后用egg-mongoose时设置一个modelDir, 就可以把所有的model挂载到app上去吗?谢谢!
我试验了一下好像不行呀
2018-04-12 15:55:43,225 ERROR 5244 [-/127.0.0.1/-/0ms GET /] nodejs.TypeError: Cannot assign to read only property 'model' of object '#<Application>'
at AppWorkerLoader.loadToApp (...................................\test\node_modules\egg-core\lib\loader\egg_loader.js:357:37)
at loadModelToApp (...................................\test\node_modules\egg-mongoose\lib\mongoose.js:94:14)
at app.beforeStart (...................................\test\node_modules\egg-mongoose\lib\mongoose.js:40:7)
at Object.callFn (...................................\test\node_modules\egg-core\lib\utils\index.js:36:42)
at process.nextTick ...................................\test\node_modules\egg-core\lib\egg.js:223:13)
at process._tickCallback (internal/process/next_tick.js:150:11)
at Function.Module.runMain (module.js:703:11)
at startup (bootstrap_node.js:194:16)
at bootstrap_node.js:618:3
对应const target = this.app[property] = {}; 那一行
loadToApp(directory, property, opt) {
const target = this.app[property] = {};
opt = Object.assign({}, {
directory,
target,
inject: this.app,
typescript: this.options.typescript,
}, opt);
new FileLoader(opt).load();
}
egg-sequelize
你解决了这个问题了吗?
请问这个问题最终的解决方案是怎样的?
问题现在还存在 今天在使用的被坑了一次 半天没找到原因
问题现在还存在 今天在使用的被坑了一次 半天没找到原因
这个是我写的一个测试例子,两个插件可以共存,可以参考看看
https://github.com/shanzemin/mongo-mysql
一个egg项目要同时支持sequelize和mongoose,需要做特殊的配置。
由于mongoose支持的默认加载model的路径无法修改(app/model),所以只能修改sequelize的model加载路径;
修改配置:
config.sequelize = {
dialect: 'mysql',
host: '...',
port: 3306,
database: '...',
username: 'root',
password: '...',
delegate: 'sequelizeModel', //挂载到app上的model名称,此配置后可以通过app.sequelizeModel访问
baseDir: 'model/sequelize', //由于mongoose已占用了默认的model路径,所以新增一个sequelize文件夹来存储sequelize要检测的model文件
};
ctx.sequelizeModel.User.findAll()关于多类型数据源支持(sequelize和mongoose)
一个egg项目要同时支持sequelize和mongoose,需要做特殊的配置。
- 由于mongoose支持的默认加载model的路径无法修改(
app/model),所以只能修改sequelize的model加载路径;- 修改配置:
config.sequelize = { dialect: 'mysql', host: '...', port: 3306, database: '...', username: 'root', password: '...', delegate: 'sequelizeModel', //挂载到app上的model名称,此配置后可以通过app.sequelizeModel访问 baseDir: 'model/sequelize', //由于mongoose已占用了默认的model路径,所以新增一个sequelize文件夹来存储sequelize要检测的model文件 };
- 调用方式:
ctx.sequelizeModel.User.findAll()
我也试着像你这样写了 ,但是好像没什么用
问题现在还存在 今天在使用的被坑了一次 半天没找到原因
这个是我写的一个测试例子,两个插件可以共存,可以参考看看
https://github.com/shanzemin/mongo-mysql
很尴尬,我贴错仓库地址了,上面的地址已经更正了,具体可以看下:mysql默认是在/app/model下,mongo默认是在app/mongo下
mongo是挂载到app对象下了,具体调用方法是app.mongo.User.find()
mysql还是原来的调用:ctx.model.Student.find()
egg-mongoose不支持目录自定义
所以只能自定义egg-sequelize//定义sequelize的配置文件
config.sequelize = {
dialect:'mysql',//支持多个sql类的
database:"test",
host:"localhost",
port:3306,
username:"root",
password:'root',
delegate:'sqlModel',//定义挂载到框架上为ctx.sqlModel
baseDir:'sqlModel',//定义model文件目录app/`${sqlModel}`
define:{ //定义表时的相关的设置,也可在表中单独定义
//timestamps:false, //是否支持自动生产created_at,updated_at.,deleted_at,自动生成的时间为标准时间
underscored: true, //是否支持驼峰转为表的下划线
freezeTableName:true, //不自动将表名转换为复数形式
//paranoid:false, //删除是否自动插入时间
}
}
Most helpful comment
egg-mongoose不支持目录自定义
所以只能自定义egg-sequelize//定义sequelize的配置文件