CNode

eggjs 或 midway 有没有办法异步加载配置文件

问答
ZzhengxsFE发布于7 年前最后回复6 年前22 回复9777 浏览0 收藏

目前后端统一管理 redis 等服务的配置信息,在应用启动前通过 http 加载配置,然后再创建应用

如果是用 koa 比较方便的实现,目前想试水 eggjs 或 midway

eggjs 或 midway 有没有办法实现这种需求,或者 plugin.js 里面禁用了,能不能手动在启用(前提是异步改的配置能起作用,看文档是同步的)?

虽然可以抽成一个配置进行管理,但是有些东西需要一些动态配置,需要比较灵活的方式进行挂历

eggjs 的 github 上看到了 egg config 异步支持#3225 目前是开放的,midway 有个询问异步启动的,但是目前都没有关闭

查看回复

回复 (22)

S
shenqidebaozi#1·7 年前

哦,可以直接挂载到 app 上有方法

I
i5ting#2·7 年前

可以的,直接serverless不更好么

W
waitingsong#3·7 年前

midway 可以的, 对于 construct 有 @init 注解。 也可以在 app.js 里面异步加载,egg midway 都支持。

J
JsonMa#4·7 年前
引用 i5ting可以的,直接serverless不更好么

@i5ting image.png 这里应该只支持同步的修改吧?异步的话是需要在didlload生命周期里去拉取然后手动合并?

Z
zhengxsFE#5·7 年前

@shenqidebaozi 不能挂 app,是插件的配置,redis 的配置是存储在数据库的 @JsonMa 我也是看的这个 @i5ting 狼叔 serverless 是好,但是只有过腾讯云出的,自己这么弄?serverless 看到的都是要收费的,但是我们自己买的是 linux 服务器,能自己配置相关环境么 @waitingsong 谢谢,我试试

H
HobaiRiku#6·7 年前

异步目前看来似乎在生命周期里面应该不行(配合一些插件的话),configwiiload是同步的钩子,如果需要异步,只能说启动完成后不能保证config对象是预期的配置,所以,我觉得如果异步的话,最好在启动后通过emit告知业务逻辑异步config已经修改好,然后其他依赖于这些config的业务再运行,不过这样一些插件就没办法按照预期的运行了。我看到egg-redis的初始化去阻塞app启动是用旧的app.beforeStart(),里面可以加async方法,但这个API比较泛,没有像新的有区分,所以没办法确保在里面异步修改config会在egg-redis加载前完成。

Z
zhengxsFE#7·7 年前

@waitingsong 大佬 init 装饰器的文档链接有么,我没找到

J
JsonMa#8·7 年前
引用 HobaiRiku异步目前看来似乎在生命周期里面应该不行(配合一些插件的话),configwiiload是同步的钩子,如果需要异步,只能说启动完成后不能保证config对象是预期的配置,所以,我觉得如果异步的话...

@HobaiRiku 现在已经不推荐使用beforestart了,替代方案是lifecycle,可在egg-core的lifecycle.js找到,之前想提个pr,在 triggerConfigWillLoad 中支持async。。。@i5ting 大佬有什么看法?

J
JsonMa#9·7 年前
引用 zhengxsFE@waitingsong 大佬 init 装饰器的文档链接有么,我没找到

@zhengxsFE 有种委婉的方案是可行的,基于环境变量来实现启动前异步加载配置,如果在egg didlload中是支持的就可以不去考虑了,这个我稍后在didload中尝试下

H
HobaiRiku#11·7 年前
引用 JsonMa@HobaiRiku 现在已经不推荐使用beforestart了,替代方案是lifecycle,可在egg core的lifecycle.js找到,之前想提个pr,在 triggerConfi...

@JsonMa 虽然是这样,但是很多插件还没有更新,另外如果更新了,官方也是建议在didload上运行插件初始化,所以这里又没办法去找比这个更前的async钩子了,还是没办法直接异步做,所以,如果configWillLoad是支持异步的话似乎就没有什么问题了。我这边一直都是在configWillLoad里面用readFileSync,这样来加载自定义的配置,如果是类似做配置系统,只能说启动前先pull好这个自定义配置文件。

Z
zhengxsFE#12·7 年前
引用 waitingsong@zhengxsFE https://midwayjs.org/injection/guide.html %E5%BC%82%E6%AD%A5%E5%88%9D%E5%A7%8B%E5%8C%...

@waitingsong 这个不是给启动的,只有用 @provide 装饰过的才可以

Z
zhengxsFE#13·7 年前
引用 JsonMa@zhengxsFE 有种委婉的方案是可行的,基于环境变量来实现启动前异步加载配置,如果在egg didlload中是支持的就可以不去考虑了,这个我稍后在didload中尝试下

@JsonMa 环境变量太约束了,会限制死程序的,我们未来会有两套独立的系统,互相之间不能访问数据的

A
atian25#17·7 年前

因为现在 2.0 不能 break,所以要到 3.0 才能有。 现在的解决方案可以是:在 agent 的 钩子里面去请求配置,写入文件;然后在 app 的 config 里面 require 这个文件

https://github.com/atian25/egg-remote-config

Z
zijin-m#20·7 年前
D
dengnan123#21·7 年前

mark 这个应该是个常见的需求

L
lvgithub#22·6 年前
参与回复
登录后即可参与回复。登录