Получить данные из наблюдаемого сервиса grp c в гнезде js, - PullRequest
3 голосов
/ 20 июня 2020

Я хочу использовать службу gRP C для связи между моими микросервисами. но при получении ответа от службы Grp c перед возвратом метода я хочу внести некоторые изменения и функциональность.

пример проекта: 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 ]

4 голосов
/ 20 июня 2020

Один из способов сделать это - преобразовать ваш 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;

}
2 голосов
/ 20 июня 2020

Вы можете использовать оператор 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` })));
  }

Если в любое время вы захотите регистрировать передаваемые значения или выполнять побочные эффекты в наблюдаемом потоке, вы можете использовать оператор tap

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