stephenh / ts-proto

An idiomatic protobuf generator for TypeScript
Apache License 2.0
2.13k stars 345 forks source link

NestJS return types for gRCP methods #313

Closed jsbrain closed 3 years ago

jsbrain commented 3 years ago

As seen in the NestJS simple example here the return type is sometimes enforced via !, e.g.

async findOneHero(data: HeroById): Promise<Hero> {
  return this.heroes.find(({ id }) => id === data.id)!; // <- here
}

but for me this is an anti pattern and I try to never use ! in my codebase. As this is just example, chances are, this isn't the proper way to do it anyway, which leads to my question:

What is the proper way to handle this?

Does gRPC not allow null types to be returned? If it does allow it, couldn't the generated code simply state Hero | undefined as return type?

Or would it be correct to throw an gRPC error if no result if found?

I'm pretty new to gRPC so any advice how to handle this properly would be much appreciated!

stephenh commented 3 years ago

Hey @jsbrain really late follow up, but I'm pretty sure RPC methods must return a value, but then within that message, you can have optional fields. So typically you see a pattern:

service HeroService {
  rpc FindHero(request FindHeroRequest) returns FindHeroResponse {}
}

message FindHeroResponse
  Hero hero = 1;

So that then the FindHeroResponse.hero can be empty.

Granted, all of the FooRequest + FooResponse messages get kind of tedious, but that's what allow the "a return value may be null" behavior you're looking for.

Thanks!

jsbrain commented 3 years ago

Right, that's what I came up with in the meantime as well. But thanks for the heads up! 😎