提问者:小点点

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


我想使用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] }

共2个答案

匿名用户

一种方法是将您的observable转换为promise,然后等待这个promise。 然后可以修改并返回结果:

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

}

匿名用户

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

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

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

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

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