如何在egg中非请求上下文获取app、ctx实例
发布于 4 年前 作者 PatrickStarCat 7009 次浏览 来自 问答

在非egg loader加载的自定义文件中,想使用egg封装的curl功能(),但是当前模块缺少请求上下文,app或ctx并没有注入当前模块文件。 请问,在非请求上下文如何获取app、ctx

15 回复

只能改为用 egg loader 加载

@atian25 谢谢,我试试,以为能绕过loader的…

感觉是你想复杂了,直接举具体的例子再讨论吧

@atian25 我的场景是:在做导出excel功能时,需要将字段值映射为中文,这个映射的json放在了动态配置的Apollo中,所以我需要curl式获取这个json,json格式例如: image.png 在app目录下创建了data_model目录,根据controller的层级进行划分,这里会包装数据返回给调用它的controller或service:如sevice对数据库查询的数据在data_model进行包装再返回service。

所以对于映射json而言:1. 与请求上下文基本无关、2.使用场景中无app、ctx(因为所在的data_model目录未loader)

回到问题本身:没有请求上下文时,如何使用egg自带的方法如curl(PS:我觉得egg-curl其实和上下文关系并不大)

老实说没太看懂 T_T

@atian25 核心就是:想在非app、ctx上下文下,使用egg-curl怎么破/(ㄒoㄒ)/~~

我的想法是,非 app 的场景变为 app 的场景。

没看懂的是你既然是 json,怎么写逻辑? 如果是 json 上面再包一层,那这一层用 loader 来加载,就有 app 了

最好是搞个最小化仓库,直接对着代码交流

要不把 data_model 改成 service 得了

嫌每个请求都会请求 Apollo 的话,可以使用 egg-schedule 定时获取并挂到 app 下面

讲道理,在 egg 里面最好是把奇奇怪怪的操作都写成 service 来实现,你这真的是想复杂了,,

不一定要 service 的,完全可以自定义 loader。

可以看看 https://github.com/atian25/egg-showcase/pull/13/files 这个示例,简单配下 config.customLoader 就可以了有 ctx.rpcapp.enum

@atian25 刚好碰见了需要loader解决的问题,这文章赞一个。

这样子??

context.js

module.exports = {
  ok: function(data) {
  //这里this就是ctx对象,记住不要使用箭头函数
    return this.response.body = {
      code: 0,
      data: data,
    };
  },
  error: function({
    code = 500,
    msg = '服务器错误',
  } = {}, tip) {
    return this.response.body = {
      code: code,
      msg: tip || msg,
    };
  },
};

app.js

const context = require('./app/extend/context');
Object.assign(app.context, context);

为什么要这么写呢

回到顶部