You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 05:40:54