在非egg loader加载的自定义文件中,想使用egg封装的curl功能(),但是当前模块缺少请求上下文,app或ctx并没有注入当前模块文件。 请问,在非请求上下文如何获取app、ctx
只能改为用 egg loader 加载
@atian25 谢谢,我试试,以为能绕过loader的…
感觉是你想复杂了,直接举具体的例子再讨论吧
@atian25 我的场景是:在做导出excel功能时,需要将字段值映射为中文,这个映射的json放在了动态配置的Apollo中,所以我需要curl式获取这个json,json格式例如: 在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.rpc
和 app.enum
等
@atian25 刚好碰见了需要loader解决的问题,这文章赞一个。
@atian25 太顶了
这样子??
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);
为什么要这么写呢