nestjsgrpc-node

Error 12 UNIMPLEMENTED: The server does not implement the method FindAllComprador


Well, I'm trying to resolve this error in my gRPC method, I've been looking at my code for hours but I can't find the error, I need get one array of elements when I use Get on Postman, but I get this error everytime:

"12 UNIMPLEMENTED: The server does not implement the method FindAllComprador"

My 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();
  }

}

My 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)
  }
  
}
My proto file:

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;
}

so, I send Get in postman but returns same error

"12 UNIMPLEMENTED: The server does not implement the method FindAllComprador"

I alredy have tried everything, but I cant get a array of elements,


Solution

  • As you have the controller and methods named differently between the proto file and the controller class, you need to use the @GrpcMethod() decorator like:

    @Controller()
    export class DadosController implements CompradosServiceController  {
      constructor(private readonly dadosService: DadosService) {}
      
      @GrpcMethod('CompradosService', 'CreateComprador')
      createComprador(request: CreateCompradorDto)  {
        return this.dadosService.create(request)
      }
    
      @GrpcMethod('CompradosService', 'FindAllComprador')
      findAllComprador()  {
       return this.dadosService.findAll()
      }
    
      @GrpcMethod('CompradosService', 'FindOneComprador')
      findOneComprador(request: FindOneCompradorDto)  {
       return this.dadosService.findOne(request.id)
      }
    
      @GrpcMethod('CompradosService', 'UpdateOneComprador')
      updateOneComprador(request: UpdateCompradorDto) {
       return this.dadosService.updateOne(request.id, request)
      }
    
      @GrpcMethod('CompradosService', 'DeleteOneComprador')
      deleteOneComprador(FindOneCompradorDto: FindOneCompradorDto)  {
       return this.dadosService.remove(FindOneCompradorDto.id)
      }
    
      @GrpcMethod('CompradosService', 'QueryComprador')
      queryComprador(request: Observable<PaginacaoDto>) {
       return this.dadosService.queryCompradores(request)
      }
      
    }
    

    For more of an example, follow the docs on the NestJS site