[eggjs/egg]context.js 拿不到实例

2025-10-27 82 views
7

in context.js const a = require('./context/A'); module.exports = { cache };

in A.js module.exports = { test(){ const { app } = this; } }

在我的service中如果我使用this.ctx.cache.test 能进入到方法中但是拿不到app了。

但是如果我把context.js内容改成 const a = require('./context/A'); module.exports = cache; 直接导出

在service中使用this.ctx.test 这样在方法体中就可以获取到app了

我不清楚egg在运行的时候是如何绑定this ?

回答

9

传个完整的代码仓库上来看看

8

这就是语法问题。。。

https://github.com/YangLG-7/test_egg/blob/master/app/extend/context.js#L4

module.exports = { test } 后 context 等于变成了:

{
  test: {
     getTestData() {
       const { app } = this;
       app.logger.info('我可以拿到app');
     }
  }
}

看到没,多了一层,egg 自动挂载就变成了 ctx.test.getTestData() 而不是你直接用的 ctx.getTestData()

而且此时, getTestData 里的 this 变成了 test 对象自身,你也拿不到 app

4

不是 我是说 如果你module.exports = { test } 在用ctx.test.getTestData() 是拿不到里面的this的 @hyj1991

7

后面不是写了么,你那样写 this 指向改了啊,变成 test 对象自身了

0

比如把你的 context.test.js 改成这样:

module.exports = {
  getTestData() {
    const { app } = this;
    app.logger.info('我可以拿到app');
  },

  app: {
    logger: {
      info(msg) {
        console.log('logger 变成我了', msg);
      }
    }
  }
};

module.exports = { test } 后,this 指向 test 对象自身了,所以拿到的 app 就是下面 mock 的这个。

其实这也是 js 语法,this 在大多数情况下指向是使用者本身(bind / call / apply 以及箭头函数是例外)

4

害~是我理解错了,我一直以为是你们内部在文件loader的时候帮我们自动绑定上了this(ctx、app等),所以我才会好奇为什么包装了一层就没有了 @hyj1991 感谢你的回复