记 egg-redis 无法启动的问题

最近在使用 egg 的过程中碰到一个问题,使用 egg-redis 插件却连不上 redis,导致启动一直失败,排除了密码错误,redis 服务没打开。这让我把目光投在 egg 和 egg-redis 的上面。

egg config 加载顺序

我是在 egg 的 config.default.js 是配置了哨兵模式,config.local.js 中重新配置 redis 为单例模式。

我怀疑是 egg config 的加载顺序有问题,但是我分别在两个 config log 了一下,发现的确是先加载 default 再加载 local。

在 egg-redis 包里打 log

既然 config 加载顺序没错,那就看看 egg-redis 有没有生效,并且拿到了什么配置。于是我在 egg-redis 的模块里直接打 log。

log 的确是调用了,但是 config 的内容就不对了。config 除了单例的配置,还包含了 default 中的哨兵配置,而 egg-redis 中的判断是这样的

1
2
3
4
5
6
7
8
9
10
11
function createClient (config, app) {
//...
if (config.cluster === true) {
...
} else if (config.sentinels) {
//...
} else {
//...
}
//...
}

最后的 else 才是进入单例的。

告破

这个问题,其实是 egg 和 egg-reids 共同导致的。

egg 的 config 加载机制,就很像 lodash 的 merge,导致哨兵模式并没有被单例覆盖。而 egg-redis 又是优先使用哨兵。

解决方案很简单,只要把哨兵的配置在 local 中配置为null


记 egg-redis 无法启动的问题
https://bubao.github.io/posts/d77eae53.html
作者
一念
发布于
2021年7月1日
许可协议