nodejs gms unexpected token in JSON at ... 오류 해결

Hotaek Han·2022년 12월 25일
0

클라이언트의 데이터를 버퍼에 실어 nodejs 서버로 보내던 중 오류가 발생했다.

 ws.on("message", data => {      // 대부분 json으로 수신될 것
            
            console.log(`Client has sent us: ${data}`);
            console.log(data);
            data = JSON.parse(data);
   
   (중략)
Uncaught SyntaxError SyntaxError: Unexpected token   in JSON at position 53

오류도 이런 식이었다. 처음엔 token이란 단어와 in이란 단어 사이의 저만큼의 공백이 무엇을 의미하는지 몰랐다. 아니, 보이지도 않았다. 그런데 오류를 구글링하던 중 다른 사람들은 >이나 '등의 어떤 캐릭터가 들어가길래 나는 왜 없지 유심히 보다가 간격의 의미를 알게 되었다.

여기까지도 많이 헤맸는데 처음엔 stringify한 문자열의 앞 뒤에 있는 공백 문제인 줄 알고 클라쪽(gms)에서 열심히 문자열을 깎아서 보냈다. 그런데도 해결되질 않았다.

오류를 다시 자세히 봤다. at position 53의 의미를 알아챌 수 있었다. 53번째에 공백 문자 때문이었다길래 저기에 왜 공백이 있겠어 하다가 드래그 해보니,

저 만큼의 공백이 있었다. 곰곰히 생각했다. 왜 저기에 뜬금없이 공백이 생겼지?

결론

지난 번 게임메이커에서 보내고자 하는 데이터의 크기에 따라 크기가 변하는 버퍼를 관찰한 적이 있다. 버퍼는 2의 제곱수로 증가했는데 지금의 데이터를 보내기 위해서 64바이트의 버퍼를 보냈을 것이고 50여개의 데이터를 채운 뒤 나머지엔 공백 문자를 자동으로 삽입했을 것이다.

즉 그 공백 문자들 때문에 파싱에 오류가 생겼던 것이다. 이런 문제도 생기는구나.. 신기했다. 게임메이커 쪽에서 버퍼 옵션을 달리 설정해서 딱 맞게 보내..는게 가능할지 모르겠는데 아니면 그냥 서버에서 trim해야겠다.

하필 공백 문자였기 때문에 눈에 보이질 않아서 해결하는데 오래 걸렸다.

0개의 댓글