从 Nestjs 中的 observable grpc 服务获取数据,

Posted

技术标签:

【中文标题】从 Nestjs 中的 observable grpc 服务获取数据,【英文标题】:Get data from observable grpc service in nestjs, 【发布时间】:2020-10-10 15:29:48 【问题描述】:

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

【问题讨论】:

【参考方案1】:

执行此操作的一种方法是将convert 您的Observable 发送到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;


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

【讨论】:

【参考方案2】:

您可以使用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.namemodify string` )));
  

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

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

【讨论】:

以上是关于从 Nestjs 中的 observable grpc 服务获取数据,的主要内容,如果未能解决你的问题,请参考以下文章

Nest JS - 为返回 Observable Axios 响应的函数编写 Jest 测试用例的问题

NestJS/RxJS - 有没有一种更简单的方法来“观察”一次?

NestJS:拦截地图和catchError

NestJs 异步 httpService 调用

如何从 NestJS 中的 Query 中获取参数

NestJS - 从 Guard 访问用户