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

Con*_*nor 4 javascript node.js socket.io

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

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

据我所知,如果你将套接字事件从主程序中分离出来,我的方式就是没有一种方法来访问io外部文件中的全局对象.仅仅require是外部文件中的Socket.IO模块是不够的.

我已经提出了这个解决方法来注入全局io对象并返回一个与签名Socket.IO期望从中间件匹配函数,它似乎工作.不过,我担心.

对我的问题有更优雅的解决方案吗?也许更清洁的选择?我错过了文档中的内容吗?

我找到的"解决方案"有没有隐藏的问题?

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);
Run Code Online (Sandbox Code Playgroud)

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();
    };
};
Run Code Online (Sandbox Code Playgroud)

任何的建议都受欢迎!

小智 6

IO对象实例的socket.io 服务器.

此实例也可以socket.server从事件处理程序中获得.

以下两个示例是等效的:

module.exports = function(io) {
    return function(socket, next) {
        socket.on('kickUser', function(data) {
            io.emit('userKicked', socket.id);
        });
        return next();
    };
};
Run Code Online (Sandbox Code Playgroud)
module.exports = function() {
    return function(socket, next) {
        socket.on('kickUser', function(data) {
            socket.server.emit('userKicked', socket.id);
        });
        return next();
    };
};
Run Code Online (Sandbox Code Playgroud)