Socket.IO 中间件,io.use

Posted

技术标签:

【中文标题】Socket.IO 中间件,io.use【英文标题】:Socket.IO middleware, io.use 【发布时间】:2018-10-04 20:05:23 【问题描述】:

开发基于 expressJS 和 Socket.io 的 Web 应用程序。 在the following post 中,我看到了中间件语法的使用,这对我来说是新的。下面是一个语法示例:

const io = require('socket.io')();

io.use(function(socket, next) 
  // execute some code
  next();
)
.on('connection', function(socket) 
    // Connection now authenticated to receive further events

    socket.on('message', function(message) 
        io.emit('message', message);
    );
);

它基本上在socket.io 实例上使用中间件函数。我之前的理解是 middlware 只能用在 express 实例上(app.use(...))。

问题:

    这种语法是否只是与app.use(...) 类似的常规中间件? 如果不同,有什么区别?

【问题讨论】:

我很困惑,'io.use'中的回调有'else'但没有'if'。 是的抱歉现在编辑有误 【参考方案1】:

根据socket.io V 3.0.4 的官方文档,socket.io 中的中间件函数io.use 是一个函数,可以像Express 一样为每个传入连接执行,但唯一的区别是套接字管理请求,其中快速 HTTP 协议管理请求。

为什么选择套接字中间件

socket.io 中的中间件函数在 请求身份验证, 可以在连接期间将其他数据(如凭据)放入套接字中。 中间件函数可以多次使用,其中每个函数按顺序运行给定函数。

【讨论】:

【参考方案2】:

io.use() 允许您指定为每个新的传入 socket.io 连接调用的函数。它可以用于各种各样的事情,例如:

    日志记录 身份验证 管理会话 速率限制 连接验证

等等……

它的用途类似于 Express 中间件(如 app.use()),但这是用于传入的 socket.io 连接,而不是传入 Express 管理的常规 http 请求。如果您希望中间件处理传入的 http 请求,请使用带有 app.use() 的 Express 中间件。如果您希望中间件处理传入的 socket.io 连接,请使用带有io.use() 的 socket.io 中间件。

【讨论】:

非常感谢!有时 Socket.io 可以使用更多的 IMO 文档。 @jfriend00 是否可以在 io.use() 中间件中转换传入数据,以便下一个中间件更改它们? 我的意思是,像 socket.use((packet, next) => packet.foo = 'bar'; next(); ); @giggioz - io.on('connection', (socket) => socket.use((packet, next) => if (packet.doge === true) return next(); next(new Error('Not a doge error')); ); ); 请注意,与 Express 中间件不同,套接字中间件只在新连接上调用一次。所以用它来做身份验证是非常有限的。它只能验证初始连接,不能验证任何后续通信。

以上是关于Socket.IO 中间件,io.use的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 io.use 中间件来捕获客户端上的错误?

重定向时丢失会话(node.js + socket.io)

如何在用户从帐户注销时断开事件触发(node.js + express socket.io)

socket.io 身份验证与共享会话数据,io.use() 如何工作

如何对使用 cookie 的 socket.io 中间件进行单元测试

使用promise和socket.io中间件来实现redux