Socket.io에서 Express의 session 미들웨어를 사용하려고 하니
express의 미들웨어는 (req, res, next)의 형태이지만,
socket.io의 미들웨어는 (socket, next)의 형태이다.
따라서 wrap이라는 함수를 만들어서 Socket.io와 Express 미들웨어를 연동했다.
//app.js
const sessionMiddleware = session({
resave: false,
saveUninitialized: false,
secret: process.env.COOKIE_SECRET,
cookie: {
httpOnly: true,
secure: false, // https적용할때 true로 변경
},
});
app.use(sessionMiddleware);
...
webSocket(server, app, sessionMiddleware);
// socket.js
const wrap = (middleware) => (socket, next) =>
middleware(socket.request, {}, next);
wrap은 고차 함수로서, 하나의 미들웨어 함수를 인수로 받아들여, Socket.io 미들웨어 형태로 반환한다.
Socket.io 미들웨어는 (socket, next) => {} 형태를 갖는다.
wrap의 목적은 Socket.io의 소켓 객체에서 request 객체를 가져와 Express 미들웨어에 제공하고, 그 후에 next 콜백을 호출하는 것이다.
chat.use(wrap(sessionMiddleware));
chat라는 Socket.io 인스턴스(또는 namespace)에서 미들웨어를 사용하도록 설정하는 코드이다.
여기서는 sessionMiddleware라는 Express 미들웨어를 wrap 함수를 통해 Socket.io 미들웨어로 변환하고 사용하도록 설정했다.
이렇게 하면, Socket.io 연결이 발생할 때마다 sessionMiddleware가 실행된다.
예를 들면, Express 세션을 사용하는 경우, 이 방법을 통해 Socket.io 연결마다 해당 세션에 접근할 수 있게 된다.