为什么 socket.io 和 express-session 不使用 next 函数

Why won't socket.io and express-session use next function

我正在尝试在我的 MERN 堆栈应用程序中使用快速会话库以及 socket.io 用于应用程序的实时消息传递部分。

对于身份验证,我正在使用 express-session 并希望将相同的中间件用于套接字连接,但是当我按照相同问题的答案进行操作时 here,中间件只是没有继续下一个函数等尝试连接时,中间件从未进入 onConnect 处理程序并且握手从未完成。

const day = 1000 * 60 * 60 * 24; // ms

const sessionStore = MongoStore.create({
    mongoUrl: "mongodb://localhost:27017/zooit",
    collection: "sessions"
});

// defining the session middlware from express-session
const session = () => expressSession({
    secret: process.env.SECRET_KEY,
    resave: false,
    saveUninitialized: true,
    store: sessionStore,
    cookie: {
        maxAge: day * 30
    }
});

// session middlware fine with express
app.use(session());

io.use((socket, next) => {
    // won't use next function
    session(socket.request, {}, next);

    // tried doing this but then in the handler session.request.session was undefined
    // next();
});

io.on("connection", require("./socket-controllers/onConnect"));
io.on("disconnect", require("./socket-controllers/onDisconnect"));
// onConnect.js
function onConnect(socket) {
    // this function isn't reached when not calling next but when explicitly calling next() socket.request.session is undefined
    console.log(`User connected: ${socket.request.session}`);
}

如果有人对我应该如何进行有任何建议那就太好了

更新,找到答案了

在 socket.io 文档中介绍了如何使用中间件和 express-session。

关键是它提供了一个包装函数,似乎可以对事物进行排序:

const wrap = middleware => (socket, next) => middleware(socket.request, {}, next);

从这里开始,您可以包装已经在 io.use:

中定义的 express-session 中间件
io.use(wrap(session()));

现在我可以像这样访问会话了:

socket.request.session

希望这对遇到同样问题的人有所帮助。