当前位置: 首页 > 知识库问答 >
问题:

NestJS gRPC未实现的流式服务器方法

郁景龙
2023-03-14

我正在尝试用NestJS和gRPC构建微服务。它有两个服务,第一个是gRPC服务,第二个是调用gRPC服务的REST服务。

首先,它可以很好地处理一元调用,即findRepoById。但它不适用于服务器流式调用findAllRepos。当我试图调用findAllRepos时,它抛出如下错误

UnhandledPromiseRejection警告:错误:12 UNIMPLEMENTED:服务器没有实现findAllRepos方法

我写的文件如下所示

// main.proto

syntax = "proto3";

import "google/protobuf/timestamp.proto";

package main;

enum Visibility {
  PUBLIC = 0;
  PRIVATE = 1;
}

message Repository {
  int32 id = 1;
  string title = 2;
  Visibility visibility = 3;
  google.protobuf.Timestamp lastSeen = 4;
}

service MainService {
  rpc findRepoById (RepoById) returns (Repository) {}
  rpc findAllRepos (NoParam) returns (stream Repository) {}
}

message RepoById {
  int32 id = 1;
}

message NoParam {}
// server.controller.ts

@Controller('repo')
export class RepoController {
  constructor(
    @Inject('RepoService') private readonly repoService: RepoService
  ) {}

  @GrpcMethod('MainService', 'findRepoById')
  findRepoById(request: RepoById, metadata: Metadata): Repository {
    const targetId = request.id;
    return this.repoService.findRepoById(targetId);
  }

  @GrpcStreamMethod('MainService', 'findAllRepos')
  findAllRepos(request: NoParam, metadata: Metadata): Observable<Repository> {
    const subject = new Subject<Repository>();

    const repositories = this.repoService.findAllRepos();
    repositories.map((repo) => {
      subject.next(repo);
    });
    subject.complete();

    return subject.asObservable();
  }
}
// client.service.ts

export class RepoGrpcService implements OnModuleInit {
  private mainService: MainServiceClient;

  constructor(@Inject('main_package') private client: ClientGrpc) {}

  onModuleInit() {
    this.mainService = this.client.getService<MainServiceClient>('MainService');
  }

  findRepoById(id: number): Observable<Repository> {
    return this.mainService.findRepoById({ id });
  }

  @GrpcStreamCall('MainService')
  findAllRepos(): Observable<Repository[]> {
    const results: Repository[] = [];

    const repoStream = this.mainService.findAllRepos({});
    repoStream.forEach((value) => console.log(value));
    repoStream.subscribe({
      next: (repo) => {
        results.push(repo);
      }
    });

    const subject = new Subject<Repository[]>();
    subject.next(results);
    subject.complete();

    return subject.asObservable();
  }
}

我想我已经遵循了NestJS gRPC文档中的所有代码,但不知怎么的,它仍然不起作用。我做错什么了吗?

共有2个答案

谷梁德容
2023-03-14

根据我的经验,如果是服务器端流,@GrpcMethod注释可以工作。文档似乎没有足够清楚地描述这一点,但对我来说,似乎只有双向流服务需要GrpcStreamMethod?

萧业
2023-03-14

我知道这个问题已经问了很久了,但这个答案可能会帮助其他人。请注意文档,由于前面章节的原因,代码的某些部分没有提及,因此NestJS也不例外。您的问题似乎来自控制器模块关系再次查看文档,确保您的控制器在正确的模块中定义,并且您的模块关系(导入)良好。

NestJs文档模块

官方示例

 类似资料:
  • 本文向大家介绍Python实现telnet服务器的方法,包括了Python实现telnet服务器的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python实现telnet服务器的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的Python程序设计有所帮助。

  • 我按照这个指令创建了一个grpc服务器和客户端:https://docs . Microsoft . com/en-us/aspnet/core/tutorials/grpc/grpc-start?view=aspnetcore-3.0 当我尝试从客户端调用服务时,客户端会显示以下错误消息:“发生了一个或多个错误。(状态(StatusCode=Unknown,Detail=No Status re

  • 本文向大家介绍SpringBoot服务上实现接口限流的方法,包括了SpringBoot服务上实现接口限流的方法的使用技巧和注意事项,需要的朋友参考一下 Sentinel是阿里巴巴开源的限流器熔断器,并且带有可视化操作界面。 在日常开发中,限流功能时常被使用,用于对某些接口进行限流熔断,譬如限制单位时间内接口访问次数;或者按照某种规则进行限流,如限制ip的单位时间访问次数等。 之前我们已经讲过接口限

  • 在之前的几篇教程中,我们讲的是如何查询和Mutation操作,这些都是在客户端那边所进行的,那么服务器这边是如何处理这些请求的呢?这就是这篇教程所要说的东西了. 准备工作 克隆库: git clone https://github.com/zhouyuexie/learn-graphql 安装依赖: cd learn-graphql && npm install cd learn-graphql

  • 我刚刚开始通过Spring Cloud了解微服务,首先我尝试从本文中重现基本示例https://spring.io/blog/2015/07/14/microservices-with-spring.这是我的代码: 尤里卡服务器 资源/registration-server.yml: 示例服务: 帐户-服务. yml: 你能打电话给我,请问我做错了什么吗? 编辑

  • 问题内容: 我想用纯Java实现我自己的Web服务器,该Web服务器应仅支持静态资源(即html,js,css,图片,电影等)。 您能推荐有关如何实现这种事情的教程或文章吗?我应该使用几个进程或线程池,还是应该考虑像NodeJS这样的面向循环事件的对象? 我知道有一些免费的网络服务器可以完全满足我的需求,但我想以此为自己的锻炼。 问题答案: 我建议您熟悉HTTP请求格式http://datatra