[eggjs/egg]在didReady事件里面如何直接请求controller

2025-11-04 423 views
8
What happens?

不是缺陷, 请教一个用法: 在didReady事件里面如何直接请求controller, 跳过所有中间件. 我们需要自己初始化request里的params和query. 现在直接请求, 连controller上的config都找不到: Cannot read property 'config' of undefined.

    async didReady() {
        const ctx = await this.app.createAnonymousContext()
        await this.app.controller.home.index()
    }
最小可复现仓库

不需要

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

不需要

相关环境信息

不需要

回答

1

放到 service

1

放到 service

大佬, 我们直接调controller是为了直接复用, 方便做缓存刷新, 这个不好弄对吧? 如果只能从service这一层去做缓存也可以, 有没有好的方式统一在service调用前面加个切面?

4

你如果确实想调 Controller,可以用 app.curl / ctx.curl 自己请求自己。

7

我们现在是直接中间件能获取controller+action. 如果curl的话就需要关注url了, 并且还有些比较麻烦, 比如接口认证.

9

需要自己初始化params和query? 这个是啥情况需要这么搞啊?

我们现在是直接中间件能获取controller+action. 如果curl的话就需要关注url了, 并且还有些比较麻烦, 比如接口认证.

url还好,通过配置可以解决这个问题。接口认证,你说的是哪种形式?

3

需要自己初始化params和query? 这个是啥情况需要这么搞啊?

@qingdengyue 因为想绕过中间件,也不想涉及到url。

url还好,通过配置可以解决这个问题。接口认证,你说的是哪种形式?

通过配置解决这个问题是指?接口认证=>登录认证

2

需要自己初始化params和query? 这个是啥情况需要这么搞啊?

@qingdengyue 因为想绕过中间件,也不想涉及到url。

url还好,通过配置可以解决这个问题。接口认证,你说的是哪种形式?

通过配置解决这个问题是指?接口认证=>登录认证

修改params和query,以及接口认证,都属于中间件的功能,然而你需要绕过中间件。即使接口认证,需要在请求前拦截。也变成了一个中间件,所以你说的绕过是不可能的,即使你自己实现的也是这个原理。如果非要为跳过,那就把所有中间件的match,都变成不匹配。

0

不是修改, 要修改肯定要先有. 不走请求就不需要那些中间件了, 就是怎么样直接发起controller调用, 以便直接复用controller内的逻辑, context request等自己实例化, egg有没有提供类似机制?

比如下面这种创建context的方式, 我调试了一下ctx.app.config是存在的, 但调用home.index这个action, 里面的this (controller?)就是undefined.

        const ctx = await this.app.createAnonymousContext()
        await ctx.app.controller.home.index()
0

不是修改, 要修改肯定要先有. 不走请求就不需要那些中间件了, 就是怎么样直接发起controller调用, 以便直接复用controller内的逻辑, context request等自己实例化, egg有没有提供类似机制?

比如下面这种创建context的方式, 我调试了一下ctx.app.config是存在的, 但调用home.index这个action, 里面的this (controller?)就是undefined.

        const ctx = await this.app.createAnonymousContext()
        await ctx.app.controller.home.index()

直接调controller不行喽~

7

为什么不调用 service

4

controller 不能直接调用,请用 service

3

class AppBootHook { constructor(app) { this.app = app; } async didReady() { const ctx = this.app.createAnonymousContext(); await ctx.service.data.get(); } } 找不到data服务,控制器里面可以正常使用,我也是醉了

1

@10zcx 启动阶段 Service 没法使用的,可以看看相关的生命周期文档 https://www.eggjs.org/zh-CN/advanced/loader#%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F