升级 egg-socket.io 到 4.4.0
阿里这个框架已经很久没更新了,连插件模块都没有人维护。本来想着用 egg-socket.io 的 2.1.1 版本就行了,但是用起来发现很多的 api 都用不了了,于是有了升级的想法,重写配置。
本文记录了升级及修改配置的步骤供大家参考。
升级包
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。
改配置
因为我们更换了包,所以需要到对应的文件夹把包换一下
- const redis = require('socket.io-redis');
+ const { createAdapter } = require('@socket.io/redis-adapter');
+ const Redis = require('ioredis');
然后找到代码
if (config.redis) {
修改如下内容:
- 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
{
io:{
enable: true,
package: "../../plugins/egg-socket.io"
}
}
这样就可以使用 4.4.0 版本了。