본문 바로가기

프로그래밍

node.js socket.io 삽질 1편 - TypeError: callback is not a function

회사에서 신규 게임으로 카지노 서버 쪽을 개발하고 있음.

 

먼저 룸 기반의 간단한 게임으로 만들려고 하기에 node.js, socket.io를 이용해서 개발을 시작함.

아무래도 처음으로 서버를 node.js 로 만들어보는거라서, 많은 예제들을 따라해 보면서 하나 둘 모듈들을 테스트 해보고 이제 본 작업에 들어감.

 

일주일간 서버, 클라 프로토콜 정의부터 같이 하고 각각 먼저 몇일 테스트 삼아 구현해보기로 함.

 

 

 

문제1.

몇 가지 예제들을 해보고 직접 간단한 룸 기반의 구조를 만들어서 테스트를 해보려다가 직접 테스트용 클라 코드를 매번 작성하기가 귀찮아 테스트 툴들을 찾아봄.

근데 테스트 툴 들이 다 안돌아감. 뭐지??? 쓰는 사람 많을텐데 왜???

알고 보니 걔네들은 socket.io 2.x 버전만 호환됨.

아, 뭐 꼭 3.x를 써야하는게 아니니 서버의 socket.io 버전을 2.3.0으로 낮춤.

(사실은 3.x 2.x 기능상 뭔 차이인지 아직 모름, 일단 돌아가면 됐지 뭐)

(처음 node를 해보는거라서 버전 설정 같은거 안하고 걍 설치되는대로 썻음.)

 

테스트 툴은 Firecamp를 씁니다. 크롬 익스텐션도 있고 맥용 앱도 있습니다.

 

문제2.

1번을 찾아보다가  발견한건데 테스트 툴들의 github를 보니깐 npm의 @types/socket.io-client 1.3.4를 쓰고 있음.

아, 지금 클라이언트가 cocos creator로 typescript를 기반으로 개발하고 있는데 혹시?

역시 같은 버전을 쓰고 있음. 1번의 이슈와 똑같음. 2.3.4 버전 사용하면 됨.

그냥 모르고 개발했으면 나중에 삽질할 뻔.

 

문제3.

자, 이제 다 됐고. 이게 가장 멘붕 컸음.

서버를 한 대에서 node.js를 pm2 cluster로 프로세스를 여러 개 띄울꺼고, 서버도 나중에 한대만 사용할 게 아니기 때문에

나중에 AWS 로드밸런스에 sticky bit 세팅해서 여러 대 세팅할 예정임.

룸, 채팅 기능들을 지원해야하니 노드 프로세스들끼리 통신을 해야함.

예전에 C++로 개발할 때 처럼 서버 군을 여러개로 나눠서 하지 않을 예정임. 왜냐 서버 개발자가 나 뿐이니깐.

나혼자 모든 통제가 가능하려면 하나의 서버에 기능 다 때려박고 옆으로 늘려야됨.

애초에 node.js를 선택할 때 부터 스케일링에 대한 자료를 많이 찾아보고 염두에 뒀음.

그래서 node.js 프로세스들 끼리는 socket.io-redis를 사용해서 통신함.

io.adapter 로 연결해서 들어오는 이벤트들을 redis에다가 sub/pub을 이용해서 알아서 쏴줌.

어라 근데 또 서버가 안돌아감.

에러를 보니 io.emit() 에서는 TypeError: callback is not a function 에러가 뜨고

socket.join(room_id, () => {.....} 이런 부분 안에서 로그도 안찍힘.

반나절 날렸음. 알고보니 이것도 버전 문제임.

 

npm install socket.io

npm install socket.io-redis 

이렇게만 설치하다가 보니 다 최신버전이 된건데, socket.io는 1,2번 문제로 버전을 2.3.0으로 내렸지만

socket.io-redis 최신버전이 socket.io 2.3.0 버전이랑 호환이 안됨.

 

socket.io-redis의 버전을 5.4.0으로 내리고 모두 해결.

 

앞으로 두달 더 이런 삽질을 해야할터인데...

나이 40넘어서 새로운걸로 만드는건 신나면서도 두렵기도하고...

시간이 아까울뿐...