Нереализованный метод потокового сервера NestJS gRPC

#protocol-buffers #nestjs #grpc #grpc-node

Вопрос:

Я пытаюсь создать микросервис с помощью NestJS и gRPC. У него есть две службы, первая из которых-служба gRPC, а вторая-служба REST, которая вызывает службу gRPC.

Во-первых, он отлично работает при унарном вызове, findRepoById rpc. Но это не работает при потоковом вызове сервера, findAllRepos rpc. Это выдает ошибку, подобную этой, когда я пытался вызвать findAllRepos rpc

Необработанное предупреждение об ошибке: Ошибка: 12 НЕ ВЫПОЛНЕНО: Сервер не реализует метод 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, но почему-то он все еще не работает. Я что-то не так делаю?

Ответ №1:

Я знаю, что прошло много времени с тех пор, как был задан этот вопрос, но, возможно, этот ответ поможет другим. Пожалуйста, обратите внимание на документацию, некоторые части кода не упоминаются из-за предыдущих глав, поэтому NestJS не является исключением. Похоже, что ваша проблема связана с отношением контроллер-модуль.Еще раз просмотрите документацию и убедитесь, что ваш контроллер определен в правильном модуле и ваши отношения модулей(импорт) в порядке.

Док-Модуль NestJS

Официальный Пример