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的主要内容,如果未能解决你的问题,请参考以下文章
如何在用户从帐户注销时断开事件触发(node.js + express socket.io)
socket.io 身份验证与共享会话数据,io.use() 如何工作