[eggjs/egg]在框架提供的configWillLoad的中使用了一个同步的阻塞式方法,然后发现框架有些中间就没有加载起来

2024-07-22 339 views
4
What happens? 最小可复现仓库

请使用 npm init egg --type=simple bug 创建,并上传到你的 GitHub 仓库

复现步骤,错误日志以及相关配置 相关环境信息
  • 操作系统:macos 10.15.1
  • Node 版本:10.17.0
  • Egg 版本:2.25.0
复现仓库

https://github.com/Saltpond/apollo-demo

问题描述

主要是在实现一个egg的apollo 的配置中心的客户端过程中需要在框架启动的时候把apollo的配置合并到app.config 下,就是在 configWillLoad 实现了这个逻辑,configWillLoad 函数是只支持同步调用的,所以采用了一个同步调用阻塞的库,然后就发现框架启动就不正常了,ctx.request.body 不能正常取到传入的参数,应用定义的中间件应该也没有加载上。

回答

6

感觉有可能是你 merge config 的时候,把内置的一些配置,如 config.middleware 等搞没了。自己调试下看看。

也可以看 run 下生成的最终合并后的配置有没有问题。

8

我之前也是怀疑我merge config 时候有问题,我把merge config 全部注释了,跑起来还是有问题, 我也比较了开启插件后和没开启插件生成run文件夹下的配置文件,除了apollo 配置一区别其他配置基本一样的,这就是我比较疑惑的点。

6

可以自行断点进去看看是啥情况。

前者是 egg-multiply 插件,后者在 egg-core

1

找到问题了?

2

应该是我使用的那个同步阻塞包的问题,具体为什么这样我也没太了解。后来我又自己用child_process.spawnSync 这个方法实现了一个同步阻塞的方法,然后发现另外一个问题了,同步阻塞,我前面在读配置中心的异步操作的事件循环就被阻塞了?,就实现不了这个地方读配置然后合并了,我就改了下我用的那个apollo 客户端的包提供出来了一个同步方法,就解决我这个需求了。最早用的那个同步阻塞的 sleep 包(https://www.npmjs.com/package/system-sleep)大佬有兴趣看下么,只要应用一下放在configWillLoad 这个方法下,稳定出现我说的问题。

1

如果是 k8s 的话,应该考虑 configmap 的方式来注入配置。

非要在 egg 里面动态配置的话,还有一种思路就是,在 agent 的生命周期里面去获取,然后写入到文件,在 worker 这边的 config 里面 require