Socket.io命名空间和服务器不共享中间件?

Chr*_*SFT 9 middleware node.js express socket.io socket.io-1.0

我为socket.io/express app创建了一些护照认证中间件.看起来像:

io.use(function (socket, next) {
    var data = cookie.parse(socket.handshake.headers.cookie);
    var sessionID = cookieParser.signedCookie(data['connect.sid'], 'my balonga has a first name');
    sessionStore.get(sessionID, function (err, data) {
        if (err) next(err);
        socket.handshake.passport = data.passport;
        next();
    });
});
Run Code Online (Sandbox Code Playgroud)

它工作得很好,但我有一个命名空间,它似乎使用不同的套接字.这是否意味着我必须为每个命名空间重用我的中间件?

我注意到我连接到我的命名空间,它调用基本服务器的中间件,然后是命名空间,这意味着如果我在两个地方都包含中间件,我正在做我需要的操作的2倍.如果不删除基础层的中间件,我可以防止这种情况吗?这些都不是应用程序破坏者,但它会改变我的架构,我担心在某些时候我会有auth间隙.

摘要:

  • 我必须为每个命名空间重用我的中间件吗?
  • 我是否可以阻止默认命名空间中间件被调用而不删除基础层上的中间件,当它是连接到的命名空间时?

nic*_*_42 1

我必须为每个命名空间重用我的中间件吗?

不。如果您计划对所有名称空间使用所写的中间件,则可以io.use()像当前一样使用。这会将中间件放置在默认/命名空间中。正如您已经注意到的,所有子命名空间上的中间件都会在新的 socket.io 连接上从默认值开始按顺序启动。

当连接到命名空间时,是否可以在不删除基础层中间件的情况下阻止调用默认命名空间中间件?

不会。所有命名空间都是默认命名空间的子空间,默认命名空间上定义的任何中间件都会针对所有连接触发。如果您只想在某些名称空间上关闭中间件,您可以避免使用io.use()并执行以下操作。

const myMiddleware = function(socket, next) {
    // Do stuff here
};
io.of('/nsp_1').use(myMiddleware);
io.of('/nsp_2').use(myMiddleware);
Run Code Online (Sandbox Code Playgroud)

更加模块化的方法

一种更模块化的方法是将不同名称空间的处理程序放在不同的不同文件中,并在这些文件中定义特定于这些名称空间的中间件,同时用于io.use()默认名称空间。

main_app.js

const everthingMiddleware = require('./middleware/everything.js');
io.use(everythingMiddleware);
require('./nsp_1.js')(io.of('/nsp_1'));
Run Code Online (Sandbox Code Playgroud)

nsp_1.js

module.exports = function(io) {
    const onePlaceMiddleware = require('./middleware/oneplace.js');
    io.use(onePlaceMiddleware);
};
Run Code Online (Sandbox Code Playgroud)

  • 从 Socket.io v3 开始,仅当客户端通过“主”命名空间(“/”)连接时才会触发“io.use”。更改是在更新 v2 → v3 上进行的。[官方文档参考](https://socket.io/docs/v3/migration-from-2-x-to-3-0/#no-more-implicit-connection-to-the-default-namespace)/ [相关Github问题](https://github.com/socketio/socket.io/issues/3089) (2认同)