NestJS gRPC маршрут 404

Я использую учебный проект NestJS gRPC:

https://github.com/nestjs/nest/blob/master/sample/04-grpc/

Содержимое файла герой.прото:

syntax = "proto3";

package hero;

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

message HeroById {
  int32 id = 1;
}

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

Насколько я понимаю, определяет путь как:

/hero.HeroService/FindOne

Содержимое герой.controller.ts:

@Controller()
export class HeroController implements OnModuleInit {
  @GrpcMethod('HeroService')
  findOne(data: HeroById): Hero {
    const items: Hero[] = [{ id: 1, name: 'John' }, { id: 2, name: 'Doe' }];
    return items.find(({ id }) => id === data.id);
  }
}

Что теоретически должно выставить метод по адресу:

http://localhost:3001/hero.HeroService/FindOne

Но при вызове выдает такую ​​ошибку:

error: "Not Found" message: "Cannot POST /hero.HeroService/FindOne" statusCode: 404

Я знаю, что попадаю в NestJS, потому что у меня есть ведение журнала промежуточного программного обеспечения. Если я выбираю маршрут GET, он работает и возвращает правильные данные, но все маршруты GRPC имеют код 404. Что мне не хватает?

Вместо этого я попробовал @Controller('hero'), чтобы попробовать префикс пути. Мне кажется непростым, чтобы NestJS отключил все конечные точки gRPC для отладки...

Полный исходный код проекта находится здесь:

https://github.com/kmturley/angular-nest-grpc

------ ОБНОВИТЬ -------

Установил grpc_cli с помощью:

brew tap grpc/grpc
brew install --with-plugins grpc

Затем попытался просмотреть конечные точки, используя:

export GRPC_VERBOSITY=DEBUG
grpc_cli ls localhost:3001

И получил ошибку:

Received an error when querying services endpoint.

Или используя:

grpc_cli call localhost:3001 FindOne "id: 1" --protofiles=src/hero/hero.proto

Я получаю сообщение об ошибке:

ServerReflectionInfo rpc failed. Error code: 14, details: OS Error

🤔 А знаете ли вы, что...
Версии Angular выпускаются с учетом совместимости и обратной совместимости, что облегчает обновление приложений на новые версии.


1 313
2

Ответы:

Решено

Решил это, добавив дополнительную строку в grpc-client.options.ts для определения URL-адреса:

export const grpcClientOptions: ClientOptions = {
  transport: Transport.GRPC,
  options: {
    url: 'localhost:50051',
    package: 'hero',
    protoPath: join(__dirname, './hero/hero.proto'),
  },
};

Затем я мог бы подключиться к нему через этот порт, используя:

grpc_cli call localhost:50051 FindOne "id: 1" --protofiles=backend/src/hero/hero.proto

Вы можете увидеть, как это работает здесь:

https://github.com/kmturley/angular-nest-grpc


порт транспорта grpc по умолчанию — 5000 в nestjs, см. https://github.com/nestjs/nest/blob/v6.10.14/packages/microservices/constants.ts#L8