为什么 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
希望这对遇到同样问题的人有所帮助。
我正在尝试在我的 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
希望这对遇到同样问题的人有所帮助。