마지막으로 route의 일부 코드를 socket 통신을 이용할 수 있도록 수정하였다.
router.post('/room', isLoggedIn, async (req, res, next)=>{
try{
const newRoom=await Room.create({
title:req.body.title,
max:req.body.max,
owner:req.user.nick,
password:req.body.password,
});
const io=req.app.get('io');
io.of('/room').emit('newRoom', newRoom);
res.redirect(`/room/${newRoom._id}?password=${req.body.password}`);
}catch(error){
console.error(error);
next(error);
}
});
router.get('/room/:id', isLoggedIn, async(req, res, next)=>{
try{
const room=await Room.findOne({_id:req.params.id});
const io=req.app.get('io');
if(!room){
return res.redirect('/?error=존재하지 않는 채팅방입니다.');
}
if(room.password&&room.password!==req.query.password){
return res.redirect('/?error=비밀번호가 틀렸습니다.');
}
const {rooms}=io.of('/chat').adapter;
if(rooms&&rooms[req.params.id]&&room.max<=rooms[req.params.id].length){
return res.redirect('/?error=허용 인원이 초과했습니다.');
}
const chats=await Chat.findOne({room:room._id}).sort('createdAt');
return res.render('chat',{
room,
title:room.title,
chats,
user:req.user.nick,
});
}catch(error){
console.error(error);
return next(error);
}
});
router.delete('/room/:id', isLoggedIn, async(req, res, next)=>{
try{
await Room.remove({_id:req.params.id});
await Chat.remove({room:req.params.id});
res.send('ok');
setTimeout(()=>{
req.app.get('io').of('/room').emit('removeRoom', req.params.id);
}, 2000);
}catch(error){
console.error(error);
next(error);
}
});
각 라우터에서 이벤트가 발생했을 시 html로 이벤트 발생을 알리는 함수를 추가하였다.