GraphQL과 Rest API 동시 사용시 Cannot read property 'headers' of undefined 에러 해결

레거시는 GraphQL, 추가 개발은 Rest 방식으로 진행되는 NestJs 기반의 백엔드에서 @Public이 아닌 Rest API에서 TypeError: Cannot read property 'headers' of undefined 가 발생하였다.

 

원인

처음 생각한 원인은 front에서 Rest API를 호출할 때, header에 토큰 정보가 포함되지 않는 것이라고 생각했는데

 

 

체크해보니 잘 들어가 있었다.

 

 

백엔드에서 JWT를 검증하는 AuthModule에서 백엔드로 들어오는 request를 체크하는 jwt-auth guard에 문제가 있었다. getRequest()메소드가 기존 @nestjs/passport에 포함되어있는 AuthGuard의 getRequest()를 오버라이드해서 GraphQL의 request만 pass 할 수 있게 되어있었다.

 

getRequest(context: ExecutionContext) {
    const ctx = GqlExecutionContext.create(context);
    return ctx.getContext().req;
  }

 

해결 방법

getRequest 메소드 내에서 request context의 타입이 GraphQL인지 HTTP인지 체크하여 해당 방식대로 request를 처리하도록 변경하였다.

 

getRequest(context: ExecutionContext) {
    if (context.getType<ContextType | 'graphql'>() === 'graphql') {
      const ctx = GqlExecutionContext.create(context);
      return ctx.getContext().req;
    } else {
      return context.switchToHttp().getRequest();
    }
  }

 

한 서버 안에 GraphQL과 Rest API를 같이 쓰는 경우가 생각보다 적어 관련 이슈를 찾기도 힘들었고, 해결하는데 생각보다 시간이 들었지만, 특이한 케이스다 보니 좋은 경험이었다.