egg-socket.io 功能
egg-socket.io是对socket.io的一个封装,加上了对router、controller、namespace和middleware的规约。
其中,router与controller主要用于分发和处理socket.io
客户端的请求,但我们之所以引入socket.io
,往往是为了获得服务端主动推送的能力,这两部分就略过了。
剩下的namespace
和middleware
与实现向指定客户端推送功能有关,在egg-socket.io
里它们都是通过配置文件进行配置的
// config.default.js
config.io = {
namespace: {
'/': {
connectionMiddleware: [ 'auth' ], //连接处理
packetMiddleware: [], //包处理
},
},
generateId: req => {
//自定义 socket.id 生成函数
const data = qs.parse(req.url.split('?')[1]);
return data.userId; // custom id must be unique
},
};
简单介绍一下作用:
namespace (命名空间)
就是socket.io的命名空间,作用相当于给客户端socket连接划分集合,同一组连接放在一个 namespace 下。
通过namespace
服务器可以向命名空间下的全体客户端广播或向指定socketId的客户端单独发送消息。
const namespace = app.io.of('/'); //获取命名空间 "/"
//namespace.sockets :连接到该命名空间的所有客户端,形式为 {id1:socket1, id2:socket2}
//通过 socket.id 就可以向该namespace下的指定客户端发送消息
namespace.sockets[socketId].emit('message', msg);
middleware (中间件)
connectionMiddleware: 连接处理中间件
对每一次 socket 连接的建立/断开进行处理
// {app_root}/app/io/middleware/connection.js
module.exports = app => {
return async (ctx