Nestjs 使用 axios

Posted

技术标签:

【中文标题】Nestjs 使用 axios【英文标题】:Nestjs using axios 【发布时间】:2019-03-22 09:45:34 【问题描述】:

这个简单的演示有一个错误 https://docs.nestjs.com/techniques/http-module

import  Get, Controller, HttpService  from '@nestjs/common';
import  AxiosResponse  from 'axios'
import  Observable  from 'rxjs'
@Controller()
export class AppController 
  constructor(private readonly http: HttpService) 
  @Get()
  root(): Observable<AxiosResponse<any>>  
    return this.http.get('https://api.github.com/users/januwA');
  

我该怎么办?

[Nest] 7356   - 2018-10-18 00:08:59   [ExceptionsHandler] Converting circular structure to JSON +9852ms
TypeError: Converting circular structure to JSON
    at JSON.stringify (<anonymous>)

nest i
common version : 5.1.0
core version   : 5.1.0

【问题讨论】:

【参考方案1】:

正如您在示例中所写,get 方法返回 AxiosResponse&lt;&gt; 并包含循环引用。 所以如果你想代理webservicehttps://api.github.com/users/januwA,你应该返回AxiosResponse.data

import  Get, Controller, HttpService  from '@nestjs/common';
import  AxiosResponse  from 'axios'
import  Observable  from 'rxjs'
@Controller()
export class AppController 
  constructor(private readonly http: HttpService) 
  @Get()
  root(): Observable<any>
    return this.httpClient.get('https://api.github.com/users/quen2404')
      .pipe(map(response => response.data));
  

【讨论】:

【参考方案2】:

您不能只返回整个 AxiosResponse 对象,因为它无法序列化为 JSON。您很可能希望得到这样的回复data

@Get()
root() 
  return this.http.get('https://api.github.com/users/januwA').pipe(
    map(response => response.data)
  );


或者使用Promises:

@Get()
async root() 
  const response = await this.http.get('https://api.github.com/users/januwA').toPromise();
  return response.data;

【讨论】:

toPromise 将被弃用,请参阅文档rxjs.dev/deprecations/to-promise 处理来自http服务的错误在map之后使用catchError函数。【参考方案3】:

您必须确保将响应作为 JSON 处理,您可以将其作为承诺返回并获取数据,使用两者之一或 HttpService 或 axios

import  Get, Controller, HttpService  from '@nestjs/common';
@Controller()
export class AppController 
  constructor(private readonly http: HttpService) 
  @Get()
      root(): 
        return this.http.get('https://api.github.com/users/quen2404')
        .toPromise()
        .then(res => res.data)
        .catch(err => /*handle error*/)
      

【讨论】:

以上是关于Nestjs 使用 axios的主要内容,如果未能解决你的问题,请参考以下文章

Nestjs 使用 axios

使用 NestJS 和 TypeOrm,在我运行 NestJS 应用程序后不会自动创建表

使用 NestJS 框架分析概念实现

NestJS - 使用 DotEnv

从使用 nestjs API 应用程序调试 npm 库(使用 noidejs、nestjs 和 typescript 构建)

NestJS:转换响应