egg-sequelize和egg-mongoose两个插件怎么样才同时使用?

Created on 25 Apr 2017  ·  23Comments  ·  Source: eggjs/egg

egg-sequelize和egg-mongoose两个插件怎么样才同时使用?
我现在发现egg-mongoose会去自动加载非mongodb的model,从而造成报错。

egg-mongoose improve question

Most helpful comment

https://github.com/shanzemin/mongo-mysql

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, //删除是否自动插入时间
    }
  }

All 23 comments

什么场景会同时使用两个?

有时候一些日志数据啥的,或者用户session啥的可能用的就是mongoose,其它重要的数据用的就是mysql了。

看来没有 model 插件之前都放在 model 目录下不是很好,暂时支持自定义目录吧?

可以支持的啊,可以配置

两个插件都可以配置 modelDir的,但是主要的问题是 app.model 可能会冲突,如果真的要用的话,model名字不要起一样的

@jtyjty99999 现在不支持,你来接单吧

这两个插件,如果app/model下面建了子目录,子目录下面有mode类,会不会加载?

应该默认支持的

egg-sequelizemodelDirapp.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

关于多类型数据源支持(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()

关于多类型数据源支持(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()

https://github.com/shanzemin/mongo-mysql

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, //删除是否自动插入时间
    }
  }
Was this page helpful?
0 / 5 - 0 ratings