채팅 앱 만들기 - socket(3)
socket.io
const SocketIO=require('socket.io');
const axios=require('axios');
const cookieParser=require('cookie-parser');
const cookie=require('cookie-signature');
module.exports=(server, app, sessionMiddleware)=>{
const io=SocketIO(server, {path:'/socket.io'});
app.set('io', io);
const room=io.of('/room');
const chat=io.of('/chat');
io.use((socket, next)=>{
cookieParser(process.env.COOKIE_SECRET)(socket.request, socket.request.res, next);
sessionMiddleware(socket.request, socket.request.res, next);
});
room.on('connection', (socket)=>{
console.log('connect room namespace');
socket.on('disconnect', ()=>{
console.log('disconnect room namespace');
});
});
chat.on('connection', (socket)=>{
console.log('connect chat namespace');
const req=socket.request;
const {headers:{referer}}=req;
const roomId=referer.split('/')[referer.split('/').length - 1].replace(/\?.+/, '');
socket.join(roomId);
socket.to(roomId).emit('join',{
user:'system',
chat:`${req.session.user}님이 입장하셨습니다.`,
});
socket.on('disconnect', ()=>{
console.log('disconnect chat namespace');
socket.leave(roomId);
const currentRoom=socket.adapter.rooms[roomId];
const userCount=currentRoom?currentRoom.length:0;
if (userCount===0){
const signedCookie=req.signedCookies['connect.sid'];
const connectSID=cookie.sign(signedCookie, process.env.COOKIE_SECRET);
axios.delete(`https://chat-nodejs.run.goorm.io/room/${roomId}`,{
headers:{
Cookie:`connect.sid=s%3A%{connectSID}`,
},
})
.then(()=>{
console.log('방 제거 요청 성공');
})
.catch((error)=>{
console.error(error);
});
}else{
socket.to(roomId).emit('exit', {
user:'system',
chat:`${req.session.user}님이 퇴장하셨습니다.`,
});
}
});
});
};
socket.io에서 세션에 접근할 때 추가적인 코드 작성이 필요.
socket.io도 미들웨어를 사용할 수 있으므로 express-session을 공유함으로써 세션에 접근이 가능.
join, disconnect 이벤트가 발생할 대 서버에서 클라이언트로 보내는 시스템 메시지를 추가하였다.
방 접속자가 0명일 때 방을 삭제하는 코드 또한 추가하였다.
Author And Source
이 문제에 관하여(채팅 앱 만들기 - socket(3)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jaehyeon2/채팅-앱-만들기-socket3저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)