node_modules를 실시간으로 디버깅하기 위해 결국 Docker 이미지에다가 vim을 설치하는 결정을 하고 마는데.....
내가 어쩌다가 이런 짓을 하게 되었나 타임라인을 정리하자면...
문제 파악
- 내가 만들고 있는 NestJS 앱에
fedify/nestjs
설치하고, FedifyModule 세팅해놓은 이후에 POST 요청 자체가 안 가고 있었음 - 왜 에러가 발생하나하고 들여다봤더니
TypeError: Response body object should not be disturbed or locked
이런 에러가 떴음. - 오류가 발생한 위치는
fedify/express
에서 코드 복붙할때 들어갔던fromERequest
함수 호출 부분 이었음. - 혹시나 하고, 비슷한 이슈가 있나하고 찾아봤는데 Fedify 279번 이슈에도 딱 내가 밟고 있는거랑 똑같은 에러메시지를 내뱉고 있었음.
- 이런 에러가 왜 발생했는지, 여기저기 찾아봤는데 hono에서도 비슷한 오류가 있었고 그걸 해결한 사례를 발견. 요약하자면, request의 body를 두번 읽으려고 해서 생긴 문제. req에 rawBody가 들어있으면 rawBody를 ReadableStream에 넣는 것으로 분기처리하고, 아니라면 기존의 코드(
Readable.toWeb(req)
) 그대로 사용하는 것.
해결 시도
- 도커 이미지 내부에는 에디터가 설치가 되어 있지 않음. 그래서, Dockerfile.dev 파일에 vim 의존성을 먼저 깔아둠
- vim 설치 후에는 docker compose exec app /bin/bash 커맨드로 도커 컨테이너 안쪽으로 들어가서, hono에서 하던 방식대로 시도하려고 했으나.... console.log 로 까보니 rawBody는 없고, 이미 파싱이 되어 있는 body만 남아있었음. -> 여기서 알게 된 점은.... "다른 미들웨어에 통과시키기도 전에 request에 있는 rawBody는 이미 읽혀져있구나..."
- NestJS의 소스코드를 까보긴 해야겠지만, 다시 돌아와서 여기서
Readable.toWeb(req)
를req.body
로 바꾸니까 기적같이 그냥 돌아감...
NestJS 분석글... 쓰긴 해야겠지...? 근데, PR에도 올리긴 해야겠는데 어떡하지.... "이렇게 고치니까 되더라!!"는 좀 아닌 것 같다.
If you have a fediverse account, you can reply to this note from your own instance. Search https://hackers.pub/ap/notes/0198c769-0800-7990-bfb7-ab621a38dfc0 on your instance and reply to it.