我为我的 socket.io/express 应用程序创建了一些护照身份验证中间件。看起来像:
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();
});
});
效果很好,但我有一个命名空间,它似乎使用了不同的套接字。这是否意味着我必须为每个命名空间重用我的中间件?
我注意到我连接到我的 namespace 时它会调用基本服务器的中间件,然后是 namespace ,这意味着如果我在两个地方都包含中间件,我将执行两倍于我需要的操作。我可以在不删除底层中间件的情况下防止这种情况发生吗?这些都不是应用程序破坏者,但它会稍微改变我的架构,我担心在某些时候我会遇到身份验证漏洞。
总结:
- 我必须为每个命名空间重用我的中间件吗?
- 当连接到命名空间时,我可以在不删除基础层中间件的情况下阻止调用默认命名空间中间件吗?
最佳答案
我必须为每个命名空间重用我的中间件吗?
没有。如果您计划对所有命名空间使用中间件,如所写,您可以像目前正在做的那样使用 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);
};
关于node.js - Socket.io 命名空间和服务器不共享中间件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27884731/