gRPC报错12 UNIMPLEMENTED:FindAllComprador方法未实现求助
gRPC方法未实现错误:FindAllComprador无法调用
问题现象
通过Postman调用gRPC接口获取元素数组时,持续返回错误:
"12 UNIMPLEMENTED: The server does not implement the method FindAllComprador"
已排查代码数小时仍未解决问题。
相关代码
Service代码
@Injectable() export class DadosService implements OnModuleInit { private readonly compraArray: Comprador[] = []; onModuleInit() { for(let i = 0; i <= 10; i++){ this.create({nomeComprador: randomUUID(), idade: randomUUID(), pais: randomUUID(), cidade: randomUUID()}); } } create(criandoCompradorDto: CreateCompradorDto): Comprador { const comprador: Comprador = { ...criandoCompradorDto, dadosCompra: {}, id: randomUUID() }; this.compraArray.push(comprador); return comprador; } findAll(): Compradores { return {compraArray: this.compraArray}; } findOne(id: string): any{ return this.compraArray.find((comprador) => comprador.id === id); } updateOne(id: string, dados: UpdateCompradorDto) { const compradorId = this.compraArray.findIndex((comp) => comp.id === id); if(compradorId !== -1){ this.compraArray[compradorId] = { ...this.compraArray[compradorId], ...dados }; return this.compraArray[compradorId]; } throw new NotFoundException(`Comprador do id: ${id}`); } remove(id: string){ const deleteId = this.compraArray.findIndex((del) => del.id === id); if(deleteId !== -1){ return this.compraArray.splice(deleteId)[0]; } throw new NotFoundException(`Comprador do id: ${id}`); } queryCompradores(paginacaoDTO: Observable<PaginacaoDto>): Observable<Compradores> { const subject = new Subject<Compradores>(); const onNext = (paginacaoDTO: PaginacaoDto) => { const start = paginacaoDTO.page * paginacaoDTO.skip; subject.next({ compraArray: this.compraArray.splice(start, start + paginacaoDTO.skip), }); }; const onComplete = () => subject.complete(); paginacaoDTO.subscribe({ next: onNext, complete: onComplete }); return subject.asObservable(); } }
Controller代码
@Controller() export class DadosController implements CompradosServiceController { constructor(private readonly dadosService: DadosService) {} createComprador(request: CreateCompradorDto) { return this.dadosService.create(request); } findAllComprador() { return this.dadosService.findAll(); } findOneComprador(request: FindOneCompradorDto) { return this.dadosService.findOne(request.id); } updateOneComprador(request: UpdateCompradorDto) { return this.dadosService.updateOne(request.id, request); } deleteOneComprador(FindOneCompradorDto: FindOneCompradorDto) { return this.dadosService.remove(FindOneCompradorDto.id); } queryComprador(request: Observable<PaginacaoDto>) { return this.dadosService.queryCompradores(request); } }
Proto文件
syntax = "proto3"; package auth; service CompradosService { rpc CreateComprador(CreateCompradorDto) returns (Comprador) {}; rpc FindAllComprador(Empty) returns (Compradores) {}; rpc FindOneComprador(FindOneCompradorDto) returns (Comprador) {}; rpc UpdateOneComprador(UpdateCompradorDto) returns (Comprador) {}; rpc DeleteOneComprador(FindOneCompradorDto) returns (Comprador) {}; rpc QueryComprador(stream PaginacaoDto) returns (stream Compradores) {}; } message Empty {}; message PaginacaoDto { int32 page = 1; int32 skip = 2; } message UpdateCompradorDto { string id = 1; string nomeComprador = 2; string idade = 3; string pais = 4; string cidade = 5; DadosCompra dadosCompra = 6; } message FindOneCompradorDto { string id = 1; } message Compradores { repeated Comprador compraArray = 1; } message CreateCompradorDto { string nomeComprador = 1; string idade = 2; string pais = 3; string cidade = 4; } message Comprador { string id = 1; string nomeComprador = 2; string idade = 3; string pais = 4; string cidade = 5; DadosCompra dadosCompra = 6; } message DadosCompra { optional string valor = 1; optional string moeda = 2; optional string bancoUsado = 3; }
解决方案
1. 修正Controller方法签名
Proto文件中FindAllComprador方法定义为接收Empty类型参数,但当前Controller中findAllComprador方法无参数,导致gRPC无法匹配到正确实现。修改方法如下:
// 确保从proto生成的代码中导入Empty类型 findAllComprador(request: Empty) { return this.dadosService.findAll(); }
2. 显式绑定gRPC方法(可选)
如果使用NestJS框架,可以给方法添加@GrpcMethod装饰器,显式指定服务和方法名,避免匹配错误:
import { GrpcMethod } from '@nestjs/microservices'; // ... @GrpcMethod('CompradosService', 'FindAllComprador') findAllComprador(request: Empty) { return this.dadosService.findAll(); }
3. 验证接口实现一致性
确认自动生成的CompradosServiceController接口的方法签名,确保Controller中所有方法的参数、返回值与接口严格匹配,包括参数类型、数量。
4. 检查服务注册
确保在模块配置中正确注册了DadosService和DadosController,同时gRPC的GrpcOptions配置中正确指定了proto文件路径。
5. 重启服务测试
修改代码后重启服务,重新调用FindAllComprador接口,确认错误是否消失。
内容的提问来源于stack exchange,提问作者user22358808
相关产品推荐
相关产品推荐

