채팅 앱 만들기 - socket(4)

Kang JaeHyeon·2021년 9월 1일
0

채팅 앱 만들기

목록 보기
8/8

마지막으로 route의 일부 코드를 socket 통신을 이용할 수 있도록 수정하였다.

routes/index.js

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로 이벤트 발생을 알리는 함수를 추가하였다.

0개의 댓글

관련 채용 정보