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

时间:2015-01-11 06:55:09

标签: node.js express socket.io middleware 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();
    });
});

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

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

要点:

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

1 个答案:

答案 0 :(得分:0)

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

不。如果您打算按照书面形式针对所有名称空间使用中间件,则可以像当前一样使用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);

更模块化的方法

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

main_app.js

const everthingMiddleware = require('./middleware/everything.js');
io.use(everythingMiddleware);
require('./nsp_1.js')(io.of('/nsp_1'));

nsp_1.js

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