阿里这个框架已经很久没更新了,连插件模块都没有人维护。本来想着用 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 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 了。