#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 не является исключением. Похоже, что ваша проблема связана с отношением контроллер-модуль.Еще раз просмотрите документацию и убедитесь, что ваш контроллер определен в правильном модуле и ваши отношения модулей(импорт) в порядке.