从 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 你的 Observable
到 Promise
并等待这个承诺。然后您可以修改 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)));
}
我想使用 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 你的 Observable
到 Promise
并等待这个承诺。然后您可以修改 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)));
}