从 nestjs 中的可观察 grpc 服务获取数据,

Get data from observable grpc service in nestjs,

我想使用 gRPC 服务在我的微服务之间进行通信。但是当从 Grpc 服务得到响应时,在 return 一个方法之前,我想做一些修改和功能。

示例项目:https://github.com/nestjs/nest/tree/master/sample/04-grpc

像这样:

@Get(':id') 
getById(@Param('id') id: string): Observable<Hero> {
  const res: Observable<Hero> = this.heroService.findOne({ id: +id }); 
  console.log(res); res.name = res.name + 'modify string'; 
  return res;
}

但在 console.log 中显示以下消息而不是原始响应。

Observable { _isScalar: false, _subscribe: [Function] }

一种方法是 convert 你的 ObservablePromise 并等待这个承诺。然后您可以修改 return 结果:

@Get(':id') 
async getById(@Param('id') id: string): Promise<Hero> {

  const res:Hero = await this.heroService.findOne({ id: +id }).toPromise();
  
  res.name = res.name + 'modify string'; 

  return res;

}

注意:如果您想坚持 Observable 使用 bharat1226 的解决方案。

您可以使用 map 运算符来转换发射值。

在下面的代码中,您将字符串 modify string 添加到 name

@Get(':id')
  getById(@Param('id') id: string): Observable<Hero> {
    return this.heroService
      .findOne({ id: +id })
      .pipe(map(item => ({ ...item, name: `${item.name}modify string` })));
  }

如果任何时候,你想在 Observable 流中记录发出的值或执行副作用,你可以使用 tap 运算符

@Get(':id')
  getById(@Param('id') id: string): Observable<Hero> {
    return this.heroService
      .findOne({ id: +id })
      .pipe(tap(item => console.log(item)));
  }