• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

질문입니다.

21.08.21 20:11 작성 조회수 105

1

안녕하세요. 제로초님

1. 

 @ApiOperation({ summary: '워크스페이스 특정 채널 가져오기' })
  @Get(':url/channels/:name')
  async getWorkspaceChannel(@Param('url'url, @Param('name'name) {
    return this.channelsService.getWorkspaceChannel(urlname);
 }

 async getWorkspaceChannel(urlstringchannelIdnumber) {
    Logger.log('---------------------------------------');
    console.log('channelId:::'channelId);
    return this.channelsRepository.findOne({
      where: {
        // workspaceId: id,
        id: channelId,
      },
    });
 }

특정워크스페이스 채널 가져오기에서 url과 name을 넘겨주잖아요?  getworkspaceChannel에서 url은 안쓰여지고 channelId는 channel name ("일반")형태로 넘어오더라구요?  그래서 결과값을 보면 undefiend가 나옵니다.

channelId면 숫자형태로 와야하는거 아닌가요? 컨트롤러와 서비스에서 받는 인자 값이 다르게 설정되어 있는데 이건 왜 그런지 궁금합니다!

2.


  @SubscribeMessage('login')
  handleLogin(
    @MessageBody() data: { idnumberchannelsnumber[] },
    @ConnectedSocket() socketSocket,
  ) {
    const newNamespace = socket.nsp;
    onlineMap[socket.nsp.name][socket.id] = data.id;
  
    newNamespace.emit('onlineList'Object.values(onlineMap[socket.nsp.name]));
    data.channels.forEach((channel=> {
     
      socket.join(`${socket.nsp.name}-${channel}`);
    });
 }

슬랙 강의 프론트랑 백엔드 다 수강하고 있는데요! 

socket.join(`${socket.nsp.name}-${channel}`);

이부분을 잘 모르겠습니다 이것을 콘솔로 찍으면

/ws-sleact 1

/ws-sleact 17

이러한 형태로 나오는데  이코드로 join한다고 해서 자동으로 조인되는건 아닌것 같고 프론트나 어디서 연결을 해줘야 조인이 되잖아요?.  프론트의 hooks폴더의 userSoket에서 연결이되어 조인 되는것인가요?...

if (!sockets[workspace]) {
    sockets[workspace] = io.connect(`${backUrl}/ws-${workspace}`, {
      transports: ['websocket'],
    });
 }

어떤 설정을 해주어서

socket.join(`${socket.nsp.name}-${channel}`);

이부분이 join이 되는지 궁금합니다...

3.

  handleConnection(@ConnectedSocket() socketSocket) {
   
    if (!onlineMap[socket.nsp.name]) {
      onlineMap[socket.nsp.name] = {};
    }
    // broadcast to all clients in the given sub-namespace
    socket.emit('hello'socket.nsp.name);
 }

여기서 emit할때 hello 이벤트가 있는데 프론트에서 hello로 이벤트를 받는 곳은 없더라구요?

어디에 쓰이는지 궁금합니다.

4. 

createWorkspaceDMChats 에서

 const receiverSocketId =  getKeyByValue(
      onlineMap[`/ws-${workspace.url}`],
      Number(id),
   );

receiverSocketId 을 콘솔로 찍어봐도 undefined라고 뜨는데 이건 무슨 값일까요 왜 undefined가 뜨는지 궁금합니다!

답변 1

답변을 작성해보세요.

0

1. param 인자는 무조건  string입니다. number로 바꾸려면 parseInt나 parseIntPipe같은걸로 변경하셔야하고요. getWorkspaceChannel는 service 부분이 잘못돼서 수정했습니다(강의에서는 안 쓰이는 컨트롤러입니다)

2. 프론트 훅스에서 io.connect로 워크스페이스(네임스페이스로 전달됨) 이름을 서버로 보내면 서버에서도 프론트에서 요청한 네임스페이스 이름인 ws-???-채널 방에 입장하게 한 것입니다. 프론트는 네임스페이스 이름으로 어디 워크스페이스에 입장할건지 알릴 뿐입니다.

3. 이건 프론트랑 연결 테스트할 때 쓰시면 됩니다. 프론트에서 on('hello', 콜백) 해보세요.

4. join이 제대로 안 돼서, 또는 onlineMap에 제대로 저장이 안 돼서 문제가 생긴 것 같습니다. undefined가 되면 안 됩니다.