升级 egg-socket.io 到 4.4.0

阿里这个框架已经很久没更新了,连插件模块都没有人维护。本来想着用 2.1.1 写就行了,但是很多 api 都用不了,于是有了自己重写的想法。

说是重写,其实也就升级一下一下包,重写一下配置。

升级包

1
2
npm uninstall socket.io redis-adapter redis
npm install socket.io@4.4.0 @socket.io/redis-adapter@7.1.0 ioredis --save

就这么简单,因为从 redis 的适配器更名了,既然用最新版本,也都跟上吧,不过 redis 最新的 4 测试好像有问题,懒得折腾,直接上 ioredis。

改配置

因为我们更换了包,所以需要到对应的文件夹把包换一下

1
2
3
- const redis = require('socket.io-redis');
+ const { createAdapter } = require('@socket.io/redis-adapter');
+ const Redis = require('ioredis');

然后找到

1
if (config.redis) {

在里面改一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-    const adapter = redis(config.redis);
- // https://github.com/socketio/socket.io-redis/issues/21
- adapter.prototype.on('error', err => {
- app.coreLogger.error(err);
- });
- app.io.adapter(adapter);
+ const pubClient = new Redis(config.redis);
+ const subClient = pubClient.duplicate();
+ pubClient.on('error', err => {
+ app.coreLogger.error(err);
+ });
+ subClient.on('error', err => {
+ app.coreLogger.error(err);
+ });
+ config.adapter = {
+ key: config.adapter?config.adapter.key:undefined,
+ requestsTimeout: config.adapter?config.adapter.requestsTimeout:5000,
+ publishOnSpecificResponseChannel: config.adapter?config.adapter.requpublishOnSpecificResponseChannel: false
+ }
+ app.io.adapter(createAdapter(pubClient, subClient,config.adapter));

这里加了一个 adapter 的参数,这是为了可以定制适配器。

使用

因为我没有把代码发成包,所以我直接把代码拷贝到项目底下

在项目根目录中新建一个plugins文件夹,把插件拷贝到该目录下,然后修改app/config/plugin.js

1
2
3
4
5
6
{
io:{
enable: true,
package: "../../plugins/egg-socket.io"
}
}

这样子就能愉快地使用 4.4.0 了。


升级 egg-socket.io 到 4.4.0
https://bubao.github.io/posts/4fcb03ef.html
作者
一念
发布于
2021年12月6日
许可协议