Combine sockets and express when using express middleware? Combine sockets and express when using express middleware? express express

Combine sockets and express when using express middleware?


Here's a way to connect socket.io and express. It uses express-session to create a secure session object for a given client. Then, when a socket.io connection happens, it gets the session for that client and stores the socket.id in the session.

Then, you are positioned to either get the socketID from the session from within an express route handler so you can emit to that client over socket.io. Or, you can get session data from that user when you are in a socket.io message handler. You can go either way. Here's the basic code:

const express = require('express');const app = express();const server = app.listen(80);const io = require('socket.io')(server);const expsession = require('express-session');const path = require('path');// initialize session middlewareconst sessionMiddleware = expsession({  secret: 'random secret',  saveUninitialized: true,  resave: true});// hook up session for express routesapp.use(sessionMiddleware);// hook up the session for socket.io connectionsio.use(function(socket, next) {    sessionMiddleware(socket.request, socket.request.res, next);});// when a socket.io connect connects, get the session and store the id in itio.on('connection', function(socket) {    // socket.handshake.headers    console.log(`socket.io connected: ${socket.id}`);    // save socket.io socket in the session    console.log("session at socket.io connection:\n", socket.request.session);    socket.request.session.socketio = socket.id;    socket.request.session.save();});// general middleware to demo an increasing, per-client value in the sessionapp.use(function(req, res, next) {    // req.session    const session = req.session;    if (!session.cntr) session.cntr = 0;    ++session.cntr;    next();});// route handler to serve up default page    app.get("/", function(req, res) {    const session = req.session;    console.log("\n\npage load\n---------------------------\n");    console.log("session:\n", session);    res.sendFile(path.join(__dirname, "socket-io-session.html"));});let cntr = 1;// test route to show using socket.io .emit() from an express routeapp.get("/api/test", function(req, res) {    const session = req.session;    io.sockets.connected[session.socketio].emit('show', cntr++);    res.json({greeting: "hello"});});