[eggjs/egg]使用mongoose插件报错ctx.model对象未定义

2025-11-04 397 views
7
What happens?

配置mongoose连接时,报错对象未定义Cannot read property 'Bank' of undefined

最小可复现仓库

请使用 npm init egg --type=simple bug 创建,并上传到你的 GitHub 仓库 https://github.com/shinji3887/eggjs-demo

复现步骤,错误日志以及相关配置

controller代码:

'use strict';

const Controller = require('egg').Controller;

class BankController extends Controller {
  async index() {
    const { ctx } = this;
    //ctx.response.body = {ret:'121212'}
    ctx.body = await this.model.Bank.find({});
  }
}

module.exports = BankController;

model代码:

'use strict';

module.exports = app => {
    const mongoose = app.mongoose;
    const Schema = mongoose.Schema;

    const UserSchema = new Schema({
      name: { type: String  },
      age: { type: Number  },
      company: { type: String}
    });
    return mongoose.model('Bank', UserSchema,'col');
}

plugin配置:

'use strict';

/** @type Egg.EggPlugin */
module.exports = {
  // had enabled by egg
  // static: {
  //   enable: true,
  // }
};

exports.mongoose = {
  enable: true,
  package: 'egg-mongoose'
};

config.default.js配置:

/* eslint valid-jsdoc: "off" */

'use strict';

/**
 * @param {Egg.EggAppInfo} appInfo app info
 */
module.exports = appInfo => {
  /**
   * built-in config
   * @type {Egg.EggAppConfig}
   **/
  const config = exports = {};

  // use for cookie sign key, should change to your own and keep security
  config.keys = appInfo.name + '_1581178232166_9983';

  // add your middleware config here
  config.middleware = ['auth'];

  config.mongoose = {
    client: {
      url: 'mongodb://127.0.0.1/eggcms', 
      options: {}
    },
  };

  // add your user config here
  const userConfig = {
    // myAppName: 'egg',
    auth: {
      threshold: 1033, // 小于 1k 的响应体不压缩
      enable: true
    }
  };

  return {
    ...config,
    ...userConfig,
  };
};

错误日志: 2020-02-10 00:14:19,867 ERROR 23485 [-/127.0.0.1/-/19ms GET /users?id=admin] nodejs.TypeError: Cannot read property 'Bank' of undefined at BankController.index (/Users/keyibunn/eggjs/app/controller/bank.js:10:33) at Object.callFn (/Users/keyibunn/eggjs/node_modules/egg-core/lib/utils/index.js:44:21) at Object.classControllerMiddleware (/Users/keyibunn/eggjs/node_modules/egg-core/lib/loader/mixin/controller.js:87:20) at Object.callFn (/Users/keyibunn/eggjs/node_modules/@eggjs/router/lib/utils.js:12:21) at wrappedController (/Users/keyibunn/eggjs/node_modules/@eggjs/router/lib/egg_router.js:322:18) at dispatch (/Users/keyibunn/eggjs/node_modules/koa-compose/index.js:44:32) at next (/Users/keyibunn/eggjs/node_modules/koa-compose/index.js:45:18) at /Users/keyibunn/eggjs/node_modules/@eggjs/router/lib/router.js:190:18 at dispatch (/Users/keyibunn/eggjs/node_modules/koa-compose/index.js:44:32) at /Users/keyibunn/eggjs/node_modules/koa-compose/index.js:36:12

相关环境信息 操作系统:mac10.15 Node 版本:v10.16.3 Egg 版本:2.26.0

回答

3

已解决,配置错误

2

已解决,配置错误

请问是哪里的配置的问题呢?

4

已解决,配置错误

请问是哪里的配置的问题呢?

产生这个问题是由于model对象未注入ctx造成的,新版的eggjs的plugin.js和官方文档的配置方式略有不同,文档里没有说明,下面是我的配置

'use strict';

/** @type Egg.EggPlugin */
module.exports = {
  // had enabled by egg
  // static: {
  //   enable: true,
  // }
    mongoose: {
      enable: true,
      package: 'egg-mongoose',
    },
    validate: {
      enable: true,
      package: 'egg-validate',
    },
    swaggerdoc: {
      enable: true,
      package: 'egg-swagger-doc',
    }
};

可以debug一下,如果ctx中有model对象了,说明插件启用成功

7
/** @type Egg.EggPlugin */

您好,非常感谢您的回复,但是我试了一下,还是取不到model对象,我的版本如下:

5

找到解决办法了,谢谢您~ 再骂自己一句,我是sb

1

@llh1187 怎么解决的 ?

1

@llh1187 怎么解决的 ?

好像是使用的时候写漏某个字段,你检查一下是不是。

1

@llh1187 怎么解决的 ?

好像是使用的时候写漏某个字段,你检查一下是不是。

console.log(this.ctx.model.attendence); 我这样检查还是访问不到model

7

@bingnoi model必须有个匹配的service或者controller 我是只写了model,所以访问不到这个model

5

已解决,配置错误

请问是哪里的配置的问题呢?

产生这个问题是由于model对象未注入ctx造成的,新版的eggjs的plugin.js和官方文档的配置方式略有不同,文档里没有说明,下面是我的配置

'use strict';

/** @type Egg.EggPlugin */
module.exports = {
  // had enabled by egg
  // static: {
  //   enable: true,
  // }
    mongoose: {
      enable: true,
      package: 'egg-mongoose',
    },
    validate: {
      enable: true,
      package: 'egg-validate',
    },
    swaggerdoc: {
      enable: true,
      package: 'egg-swagger-doc',
    }
};

可以debug一下,如果ctx中有model对象了,说明插件启用成功

确实是这样,我是照着官方文档操作的,结果一直找不到model。照你这个方式写plugin正常了,感谢?

9

已解决,配置错误

请问是哪里的配置的问题呢?

产生这个问题是由于model对象未注入ctx造成的,新版的eggjs的plugin.js和官方文档的配置方式略有不同,文档里没有说明,下面是我的配置

'use strict';

/** @type Egg.EggPlugin */
module.exports = {
  // had enabled by egg
  // static: {
  //   enable: true,
  // }
    mongoose: {
      enable: true,
      package: 'egg-mongoose',
    },
    validate: {
      enable: true,
      package: 'egg-validate',
    },
    swaggerdoc: {
      enable: true,
      package: 'egg-swagger-doc',
    }
};

可以debug一下,如果ctx中有model对象了,说明插件启用成功

确实是这样,我是照着官方文档操作的,结果一直找不到model。照你这个方式写plugin正常了,感谢?

我复制官方的设置方法会找不到model层,但是按照这个设置方法会报如下错误:

2021-02-20 15:47:03,653 ERROR 7315 nodejs.AppWorkerDiedError: [master] app_worker#22:8535 died (code: 0, signal: null, suicide: false, state: dead), current workers: []
    at Master.onAppExit (/Users/kim/DEV/homestay/backEnd/node_modules/egg-cluster/lib/master.js:510:21)
    at Master.emit (node:events:376:20)
    at Messenger.sendToMaster (/Users/kim/DEV/homestay/backEnd/node_modules/egg-cluster/lib/utils/messenger.js:137:17)
    at Messenger.send (/Users/kim/DEV/homestay/backEnd/node_modules/egg-cluster/lib/utils/messenger.js:102:12)
    at EventEmitter.<anonymous> (/Users/kim/DEV/homestay/backEnd/node_modules/egg-cluster/lib/master.js:353:22)
    at EventEmitter.emit (node:events:388:22)
    at ChildProcess.<anonymous> (node:internal/cluster/master:199:13)
    at Object.onceWrapper (node:events:483:26)
    at ChildProcess.emit (node:events:376:20)
    at Process.ChildProcess._handle.onexit (node:internal/child_process:284:12)
name: "AppWorkerDiedError"
pid: 7315

我太难了吧,请问这个错误有知道原因的大佬吗?