inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

배달앱 클론코딩 [with React Native]

실시간 데이터 받기, 로그아웃(Bearer 토큰)

socket의 emit에 관하여 질문있습니다!

237

jkl154527

작성한 질문수 3

0

socket.emit('login', 'hello') 해당 부분에서 emit을 계속 찍어내는 문제가 발생하고 있습니다!!

 

useEffect의 dependenciy의 의존성을 주입 안 하면 emit을 계속 안 찍는데 어떻게 하는게 맞을까요 ??

// 로그인 후 emit을 계속 보낸다.
  useEffect(() => {
    const helloCallback = (data: any) => {
      console.log(data);
    };

    if (socket && isLoggedIn) {
      socket.emit('login', 'hello');
      socket.on('hello', helloCallback);
    }

    return () => {
      if (socket) socket.off('hello', helloCallback);
    };
  }, [isLoggedIn, socket]);

// 로그인 후 한 번만 emit을 보낸다.
  useEffect(() => {
    const helloCallback = (data: any) => {
      console.log(data);
    };

    if (socket && isLoggedIn) {
      socket.emit('login', 'hello');
      socket.on('hello', helloCallback);
    }

    return () => {
      if (socket) socket.off('hello', helloCallback);
    };
  }, []);

 

아래는 emit을 계속 보내는 log 입니다.스크린샷 2024-01-22 16.23.06.png

react-native

답변 1

0

제로초(조현영)

socket과 isLoggedIn을 콘솔로 찍어보세요. 이 둘의 값이 자꾸 바뀌는 것 같습니다.

0

jkl154527

선생님 코드를 복붙 해도 동일한 결과가 반복됩니다.

다른 해결 방법이 있을까요 ?

// AppInner
const AppInner = () => {
  const isLoggedIn = useSelector((state: RootStateType) => !!state.user.email);
  const [socket, disconnect] = useSocket();

  useEffect(() => {
    const helloCallback = (data: any) => {
      console.log(data);
    };

    if (socket && isLoggedIn) {
      socket.emit('login', 'hello');
      socket.on('hello', helloCallback);
    }

    return () => {
      if (socket) {
        socket.off('hello', helloCallback);
      }
    };
  }, [isLoggedIn, socket]);

  useEffect(() => {
    if (!isLoggedIn) disconnect();
  }, [disconnect, isLoggedIn]);

  return (
    <NavigationContainer>
      {isLoggedIn ? (
        <Tab.Navigator>
          <Tab.Screen name="Orders" component={Orders} options={{ title: '오더 목록' }} />
          <Tab.Screen name="Delivery" component={Delivery} options={{ headerShown: false }} />
          <Tab.Screen name="Settings" component={Settings} options={{ title: '내 정보' }} />
        </Tab.Navigator>
      ) : (
        <Stack.Navigator>
          <Stack.Screen name="SignIn" component={SignIn} options={{ title: '로그인' }} />
          <Stack.Screen name="SignUp" component={SignUp} options={{ title: '회원가입' }} />
        </Stack.Navigator>
      )}
    </NavigationContainer>
  );
};

// useSocket
const useSocket = (): useSocketReturnType => {
  const disconnect = useCallback(() => {
    if (socket) {
      socket.disconnect();
      socket = undefined;
    }
  }, []);

  if (!socket) {
    socket = SocketIOClient(Config.API_URL as string, {
      transports: ['websocket']
    });
  }

  return [socket, disconnect];
};

0

jkl154527

백엔드 코드에서 이 부분이 문제가 아닐까 생각드는데 맞을까요 ? 해당 부분 주석처리하면 emit이 한 번만 갑니다!

id = setInterval(() => {
       io.emit("hello", "emit");
      }, 1000);

0

제로초(조현영)

네 거기 주석처리하시면 이밋 자체를 없애는 거라 되긴 한데요. 그래도 deps 배열 유무로 차이가 나는 건 좀 이상하네요

앱실행시 네이버맵 [401] 에러

0

955

2

스타일링 라이브러리

0

146

2

expo, cli 선택 중에 고민이 있습니다.

0

167

2

JDK 버전이 달라도 괜찮나요?

0

223

2

dimenstion usewindowdeminstion

0

120

3

[맥 전용]환경 설정하기 1편 & [맥 전용]환경 설정하기 2편의 영상이 안나옵니다.

0

209

1

jdk11 버전과 gradle 버전의 호환성 관련 질문드립니다.

0

398

2

강의 외 질문입니다!

0

157

2

react native랑 맞는 ui 라이브러리 어떤게 좋을까요?

0

1485

2

react native와 spring boot 연결

0

353

1

java가 아닌 .kt에서 code push 에러가 발생합니다.

0

210

2

flipper 239 에러가 발생합니다.

0

162

2

package.json에 /lib/panino.js 문제입니다.

0

464

2

window - mac 협업 과정 질문합니다

0

214

1

ios 빌드 중 RCTBridgeDelegate.h import 오류

0

289

2

ios 앱 빌드 중 hermesEnabled 관련 오류발생

0

238

2

Socket 연결시 질문 드립니다.!

0

151

2

wifi 환경에서 axios 통신이 로컬서버에서 안됩니다.

0

425

2

iOS render error 질문드립니다.

0

410

2

iOS 가상머신 오류

0

164

2

npc react init 명령어 실행시 발생되는 오류

0

220

1

nom start 시 오류

0

116

1

NextJS 기반으로 만들어서 웹뷰 React Native로 배포 가능한가요?

0

994

2

안드로이드 rn75 버전에 맞게 설정 중에 android13 다운로드에 대해서 막혔습니다!

0

183

2