NestJS gRPC路线404

时间:2019-01-27 23:04:47

标签: angular grpc nestjs

我正在使用NestJS gRPC教程项目:

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

hero.proto文件内容:

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

hero.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

但是当被调用时,会产生此错误:

  

错误:“未找到”消息:“无法发布/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

出现错误:

  

查询服务端点时收到错误。

或使用:

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

我得到了错误:

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

2 个答案:

答案 0 :(得分:0)

通过在grpc-client.options.ts中添加额外的一行以定义网址来解决该问题:

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

答案 1 :(得分:0)

grpc传输的默认端口是nestjs中的5000,请参见https://github.com/nestjs/nest/blob/v6.10.14/packages/microservices/constants.ts#L8