【问题标题】:NestJS HttpService Call Multiple Endpoints SimultaneouslyNestJS HttpService 同时调用多个端点
【发布时间】:2021-12-10 14:12:52
【问题描述】:

我正在使用 NestJS HttpModule 为一个端点发出 GET 请求。代码有点像这样:

@Injectable
export class AnimalService {
  constructor(private httpService: HttpService){}
  
  getAnimalData(variant: string): Observable<AxiosResponse<Animal>> {
    return this.httpService
      .get(`http://animal.test/${variant}`)
      .pipe(map((response) => response.data));
  }
}

现在我想创建一个同时调用多个端点的方法。

getAllAnimalsData() {
  // const variants = ['birds', 'cats', 'dogs'];
  // call 
  //   http://animal.test/birds
  //   http://animal.test/cats
  //   http://animal.test/dogs
  // simultaneously
  // and process the response data
}

如何使用 NestJS HttpModule 实现这一点? 我如何处理每个结果? 如果出现部分错误(例如 3 个请求中有 1 个有错误),我该如何处理?

【问题讨论】:

  • 打多个端点似乎不是一个好主意,为什么不创建一个返回数组本身的端点?
  • 问题是那些端点来自第三方。我不能直接更改它们或建议他们添加更多端点

标签: node.js axios rxjs observable nestjs


【解决方案1】:

如果你想同时发出多个 http 请求,你可以使用 RxJS forkJoin 操作符。我还为每个 Observable 添加了catchError,以便将任何错误传递给订阅回调。当所有 Observable 完成时,订阅回调触发。

getAllAnimalsData() {
  const variants = ['birds', 'cats', 'dogs'];
  
  forkJoin(
    variants.map(v => 
      getAnimalData(v).pipe(catchError(e => of(e)))
    )
  )
  .subscribe(([r1, r2, r3]) => /* ... */)
}

【讨论】:

    猜你喜欢
    • 2020-04-16
    • 2019-01-25
    • 2022-01-25
    • 2021-12-21
    • 2011-11-26
    • 2022-09-23
    • 2019-08-21
    • 2019-08-31
    • 2020-06-23
    相关资源
    最近更新 更多