3

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

示例项目: 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] }
4

2 回答 2

7

一种方法是你的转换Observable为 aPromise并等待这个承诺。然后您可以修改并返回结果:

@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 的解决方案。

于 2020-06-20T13:32:46.127 回答
3

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

在下面的代码中,您将字符串添加modify stringname.

@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 流中记录发出的值或执行副作用,您可以使用点击运算符

@Get(':id')
  getById(@Param('id') id: string): Observable<Hero> {
    return this.heroService
      .findOne({ id: +id })
      .pipe(tap(item => console.log(item)));
  }
于 2020-06-20T14:04:03.377 回答