我正在构建一个NestJS api,需要调用外部API并解析响应数据。这是一个healthCheck,用于查看另一个API是否已启动并运行。以下是基本呼吁:
    @Get('healthCheck')
    public async healthCheck(
        @Req() req: Request,
        @Res() res: Response,
    )
    {
        const obj = this.test(req);
        console.log(obj)
    }
    test(req) {
        const testingURL = 'https://google.com';
        return this.http.get(testingURL).pipe(
            map((obj: AxiosResponse) => { return obj.data } ),
            tap(console.log)
        );
    }我过去曾广泛地使用过角,对返回的数据执行任何类型的".toPromise()“或”订阅()“都会导致”将循环结构转换为JSON“。
目前,第一部分中的"console.log(obj)“正在打印一个不可解析的可观察对象:
Observable {
  source: Observable {
    source: Observable { _subscribe: [Function (anonymous)] },
    operator: [Function (anonymous)]
  },
  operator: [Function (anonymous)]
}任何建议或有用的暗示都是有帮助的。讨论这个问题的大多数其他帖子都说,简单地映射响应或添加承诺可以解决这个问题,但它没有进一步解释如何在获取之后解析可观察到的响应。
编辑:解决方案张贴在下面。
发布于 2021-10-15 20:15:00
感谢https://stackoverflow.com/users/9576186/jay-mcdoniel在这方面的帮助和本项目参考https://github.com/jmcdo29/heart-watch/blob/feat/nest-commander/src/character-reader/character-reader.api.service.ts
以下是我的工作解决方案:
  @Get('healthCheck')
  public async healthCheck() {
    const obj = await this.getEndpoint('https://google.com');
    console.log(obj);
  }
  private getEndpoint(url): Promise<any> {
    return lastValueFrom(
      this.http.get<any>(url).pipe(
        map((res) => {
          return res.data;
        }),
      ),
    );
  }这应该解析任何get (或post)端点,只要参数/auth不是必需的,并使用axios将可观察到的解析结果返回到nestjs中。
编辑:正如Jay所建议的,lastValueFrom使用的不是降级的toPromise()
发布于 2021-10-14 21:21:57
@Res()注入路由处理程序,只需返回数据并让Nest处理它,而不必调用res.send()。如果需要访问响应头或设置cookie,请使用@Res({ passthrough: true })如果需要读取可观察到的值,可以使用来自和pipe(tap(console.log))的tap运算符读取数据。
编辑10/15/2021
现在我也读到您希望在另一个API调用中使用这些数据,您有两个选项:
lastValueFrom将可观察到的RxJS转换为Promise,以便可以对其进行await编辑。简单易用的mergeMap或switchMap之类的运算符,并将可观察到的数据链在一起,最后仍然返回一个可观察的结果。RxJS就像非常强大的回调,上面有额外的选项,但是它们也会变得复杂,所以这个选项通常需要更多的细微差别和奉献精神,以确保操作符被正确地链接。发布于 2022-06-22 23:20:23
您应该从HttpService (@nestjs/axios)注入axios,并获得类似于这个this.httpService.axiosRef.get(...)的axios引用
有关详细信息,请参阅正式文档。
https://stackoverflow.com/questions/69577453
复制相似问题