인프런 커뮤니티 질문&답변

supp0rtyoo님의 프로필 이미지
supp0rtyoo

작성한 질문수

[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지

emit 관련 질문 드립니다

해결된 질문

작성

·

132

0

채팅 기능 구현 중에 해결이 안되는 문제가 있어서 질문 드립니다.

Router 내에서 req.app.get('io').of('/chat').to(chatting_id).emit('chat', message) 방식으로 소켓에 데이터를 전달할 경우 해당 chatting_id 소켓에 연결되어있는 클라이언트들에게 메세지가 전달되지 않습니다.

 

socket.js 안의 on에서 동일하게 chatting_id를 통해서 emit할경우 수신/발신 모두 정상적으로 진행됩니다.. chatting_id 값은 숫자 1로 동일합니다.

 

콘솔에 req.app.get('io').of('/chat') 까지는 객체가 잘 들어있는것을 확인했습니다.. 강의 내부에서 동작하는것과 똑같이 작성한것같은데 원인이 무엇일까요..?

 

라우터 파일(별도 파일로 작성 후 router.js에서 사용)

exports.createChattingContents = async (req, res, next) => {
    const chattingContents = req.body.chatting_contents;
    const chat = req.app.get('io').of('/chatting');

    try {
        const createdResult = await ChattingContentsRepository.create(chattingContents);

        chat.to(createdResult.chatting_id).emit('chat', createdResult);
       
        res.status(200).send({
            ok: true,
            data: createdResult,
        });
    } catch (error) {
        next(error);
    }
};
 
 
Socket의 chat 부분
 
socket.on('chat', (data) => {
  const chattingContents = data;
 
  socket.to(chattingId).emit('chat', data);
});

답변 2

0

supp0rtyoo님의 프로필 이미지
supp0rtyoo
질문자

아 네네 

 

const io = SocketIO(server, { path: '/socket.io'});
    app.set('io', io);
    const chat = io.of('/chatting');
 
이렇게 선언해뒀습니다
제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

프론트쪽도 chatting이 맞나요?

supp0rtyoo님의 프로필 이미지
supp0rtyoo
질문자

postman으로 테스트 진행하고있는데 chatting쪽에 응답이 없습니다

socket 안에서는 오는데 router에서 진행할때는 안와요..

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

아뇨 프론트 소켓 코드에서 네임스페이스도 chatting으로 하신게 맞냐고 질문한겁니다.

supp0rtyoo님의 프로필 이미지
supp0rtyoo
질문자

const io = SocketIO(server, { path: '/socket.io'});
    app.set('io', io);
    const chat = io.of('/chatting');
 
네 네임스페이스도 이렇게 선언했습니다
제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

아뇨 여기는 프론트가 아닙니다. ㅠㅠ 여기는 서버에요. 저기는 네임스페이스 선언하는 부분이 아닙니다. 프론트랑 서버랑 둘 다 네임스페이스가 chatting이어야하는데 서버만 그런 것 같습니다.

supp0rtyoo님의 프로필 이미지
supp0rtyoo
질문자

아 프론트요.. 프론트는 포스트맨에서 접속했고,, 주소는 http://localhost:80/chatting

eventlistner로 chat 으로 선언해서 구성했습니다.

router를 이용하지 않고 소켓 내에서 event name chat으로 진행하면 연결된 유저들 사이에서 수/발신 정상적으로 진행됩니다.. 근데 router 내에서 emit 할때만 해당 메세지가 전달이 안되네요..

라우터는

router.post('/', ChattingContentsService.createChattingContents);

이렇게 구성되어있습니다.

supp0rtyoo님의 프로필 이미지
supp0rtyoo
질문자

postman에서 메세지 수신하면 이렇게 노출됩니다

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

뭔가 포스트맨이랑 브라우저랑 웹소켓 연결이 다른 것 같은데요. 브라우저로는 해보셨나요?

supp0rtyoo님의 프로필 이미지
supp0rtyoo
질문자

아뇨 저는 프론트를 따로 만들지 않아서,, 브라우저로 확인은 못해봤네요..

테스트용으로라도 프론트를 따로 만들어서 진행해보는게 좋을까요?

소스 단에서 제가 열심히 본다곤 했는데 별개로 이슈는 없겠죠..?

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

아니면 포스트맨 접속 프로토콜을 ws://localhost:80/chatting으로 해보세요.

강좌와 다른 부분이라 어떤 부분이 다른지 확인이 안 되네요.

supp0rtyoo님의 프로필 이미지
supp0rtyoo
질문자

네 말씀해주신대로 확인해보겠습니다

감사합니다!

supp0rtyoo님의 프로필 이미지
supp0rtyoo
질문자

해결을 했는데 혹시 다른분들도 비슷한 증상으로 고생하실까봐 댓글 남깁니다.

chatting_id로 소켓 분리 시 한곳은 '1', 한곳은 1로 지정되어서 송수신이 원활히 진행되지 않았었던것으로 확인했습니다. 타입이 없으니 이런 오류도 발생하네요..ㅎㅎ

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

of /chatting으로 되어있는데 일부러 바꾸신건가요?

supp0rtyoo님의 프로필 이미지
supp0rtyoo

작성한 질문수

질문하기