docs: use io.engine.use() with express-session

Related: https://github.com/socketio/socket.io/discussions/4819
This commit is contained in:
Damien Arrachequesne
2023-09-13 12:13:03 +02:00
parent fd9dd74eee
commit 8259cdac84
3 changed files with 9 additions and 31 deletions

View File

@@ -52,6 +52,10 @@
socket.on("disconnect", () => {
ioStatus.innerText = "disconnected";
});
socket.on("current count", (count) => {
ioCount.innerText = count;
});
</script>
</body>
</html>

View File

@@ -24,6 +24,8 @@ app.post("/incr", (req, res) => {
const session = req.session;
session.count = (session.count || 0) + 1;
res.status(200).end("" + session.count);
io.to(session.id).emit("current count", session.count);
});
app.post("/logout", (req, res) => {
@@ -35,37 +37,9 @@ app.post("/logout", (req, res) => {
});
});
const io = new Server(httpServer, {
allowRequest: (req, callback) => {
// with HTTP long-polling, we have access to the HTTP response here, but this is not
// the case with WebSocket, so we provide a dummy response object
const fakeRes = {
getHeader() {
return [];
},
setHeader(key, values) {
req.cookieHolder = values[0];
},
writeHead() {},
};
sessionMiddleware(req, fakeRes, () => {
if (req.session) {
// trigger the setHeader() above
fakeRes.writeHead();
// manually save the session (normally triggered by res.end())
req.session.save();
}
callback(null, true);
});
},
});
const io = new Server(httpServer);
io.engine.on("initial_headers", (headers, req) => {
if (req.cookieHolder) {
headers["set-cookie"] = req.cookieHolder;
delete req.cookieHolder;
}
});
io.engine.use(sessionMiddleware);
io.on("connection", (socket) => {
const req = socket.request;

View File

@@ -10,6 +10,6 @@
"dependencies": {
"express": "~4.17.3",
"express-session": "~1.17.2",
"socket.io": "~4.4.1"
"socket.io": "^4.7.2"
}
}