Я использую учебный проект 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 выпускаются с учетом совместимости и обратной совместимости, что облегчает обновление приложений на новые версии.
Решил это, добавив дополнительную строку в 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