首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NestJS API调用和读取API中的响应数据。

NestJS API调用和读取API中的响应数据。
EN

Stack Overflow用户
提问于 2021-10-14 21:18:50
回答 3查看 6.3K关注 0票数 1

我正在构建一个NestJS api,需要调用外部API并解析响应数据。这是一个healthCheck,用于查看另一个API是否已启动并运行。以下是基本呼吁:

代码语言:javascript
运行
复制
    @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)“正在打印一个不可解析的可观察对象:

代码语言:javascript
运行
复制
Observable {
  source: Observable {
    source: Observable { _subscribe: [Function (anonymous)] },
    operator: [Function (anonymous)]
  },
  operator: [Function (anonymous)]
}

任何建议或有用的暗示都是有帮助的。讨论这个问题的大多数其他帖子都说,简单地映射响应或添加承诺可以解决这个问题,但它没有进一步解释如何在获取之后解析可观察到的响应。

编辑:解决方案张贴在下面。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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

以下是我的工作解决方案:

代码语言:javascript
运行
复制
  @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()

票数 1
EN

Stack Overflow用户

发布于 2021-10-14 21:21:57

  1. ,除非您有原因,否则不要将@Res()注入路由处理程序,只需返回数据并让Nest处理它,而不必调用res.send()。如果需要访问响应头或设置cookie,请使用@Res({ passthrough: true })

  1. 您可以直接返回可以在巢中观察到的数据,Nest将处理读取数据并将其发回给您。

如果需要读取可观察到的值,可以使用来自和pipe(tap(console.log))tap运算符读取数据。

编辑10/15/2021

现在我也读到您希望在另一个API调用中使用这些数据,您有两个选项:

  1. 使用lastValueFrom将可观察到的RxJS转换为Promise,以便可以对其进行await编辑。简单易用的

  1. 使用mergeMapswitchMap之类的运算符,并将可观察到的数据链在一起,最后仍然返回一个可观察的结果。RxJS就像非常强大的回调,上面有额外的选项,但是它们也会变得复杂,所以这个选项通常需要更多的细微差别和奉献精神,以确保操作符被正确地链接。
票数 0
EN

Stack Overflow用户

发布于 2022-06-22 23:20:23

您应该从HttpService (@nestjs/axios)注入axios,并获得类似于这个this.httpService.axiosRef.get(...)的axios引用

有关详细信息,请参阅正式文档。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69577453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档