Socket.IO - 中间件和范围:我应该如何从外部中间件访问全局 IO 对象?

Socket.IO - Middleware and scoping: how should I access global IO object from external middleware?

我已将我正在开发的 Socket.IO 应用程序的某些部分拆分为各种中间件,这些中间件执行应用程序所需的操作,例如管理会话和强制执行访问限制。

我目前正在尝试编写另一组中间件函数来处理当前连接的套接字列表,这些套接字旨在用于将特定客户端从服务器中踢出,我发现自己需要全局 io socket.on 事件回调上下文中的对象通过 io.sockets.in('room').emit(...).

向特定房间广播消息

据我所知,如果您按照我的方式将套接字事件从主程序中分离出来,则无法以简洁的方式访问外部文件中的全局 io 对象。仅仅 require-ing 外部文件中的 Socket.IO 模块是不够的。

我想出了这个解决方法来注入全局 io 对象和 return 匹配 the signature Socket.IO expects from middleware 的函数,它似乎可以工作。还是很担心。

我的问题有更优雅的解决方案吗?也许是更清洁的选择?我是否遗漏了文档中的内容?

我发现的"solution"是否有任何隐藏的陷阱?

index.js

// Other required stuff- Express.js, Mongoose, whatever.
var io = require('socket.io').listen(server);

var Middleware = require('./middleware.js')(io);
io.use(Middleware);

server.listen(port);

middleware.js

module.exports = function(io) {
    return function(socket, next) {
        socket.on('kickUser', function(data) {
            // Do something with the global io object here.
        });
        return next();
    };
};

欢迎任何建议!

io对象是实例asocket.ioServer.

此实例也可通过事件处理程序中的 socket.server 使用。

下面两个例子是等价的:

module.exports = function(io) {
    return function(socket, next) {
        socket.on('kickUser', function(data) {
            io.emit('userKicked', socket.id);
        });
        return next();
    };
};

module.exports = function() {
    return function(socket, next) {
        socket.on('kickUser', function(data) {
            socket.server.emit('userKicked', socket.id);
        });
        return next();
    };
};