백엔드 Back-end/네스트제이에스 NestJS

Q. NestJS gRPC 클라이언트 구현에서 "The invalid gRPC service (service not found)" 에러 원인은?

Tap to restart 2022. 2. 23. 20:00

A. service명이 잘못 되어서 그렇다.

여기서 service명은 gRPC 서비스명이다.

 

예를 들어서 아래와 같은 hero.proto 파일이 있다.

(출처: nestjs microservices gRPC)

syntax = "proto3";

package hero;

service HeroesService {
  rpc FindOne (HeroById) returns (Hero) {}
}

message HeroById {
  int32 id = 1;
}

message Hero {
  int32 id = 1;
  string name = 2;
}

여기서 서비스명은 'HeroesService'이다. 팩키지명은 'hero'이다.

service ABCD {
  rpc FindOne (HeroById) returns (Hero) {}
}

만약 위와 같다면 서비스명은 'ABCD'이다. 서비스명은 proto파일을 만드는 사람 마음대로 정의할 수 있다.

 

gRPC 클라이언트 코드 예는 아래와 같다.

@Injectable()
export class AppService implements OnModuleInit {
  @Client({
    transport: Transport.GRPC,
    options: {
      package: 'hero',
      protoPath: join(__dirname, 'hero/hero.proto'),
    },
  })
  client: ClientGrpc;

  private heroesService: HeroesService;

  onModuleInit() {
    this.heroesService = this.client.getService<HeroesService>('HeroesService');
  }

  getHero(): Observable<string> {
    return this.heroesService.findOne({ id: 1 });
  }
}

(출처: nestjs microservices gRPC)

 

위 코드에서 만약 서비스명이 ABCD라면,

this.heroesService = this.client.getService<HeroesService>('ABCD');

라고 해야 한다.

 

아직 IDE가 proto 파일을 읽어서 자동 완성을 잘 안 해주므로, 사소한 실수로 작동이 안 되고 디버깅이 어렵다.