如何使用 Nest.js 中的 axios HttpService 发出 POST 请求

Obv*_*uit 28 nestjs

我正在尝试使用发出 POST 请求@nestjs/axios,然后访问响应。

到目前为止,这是我的代码:

verifyResponse(captcha_response: String): Observable<AxiosResponse<any>> {

    return this.httpService.post('some url', {
        captcha_response
    });
}
Run Code Online (Sandbox Code Playgroud)

但是,我不确定如何访问响应数据。如果我用来console.log()查看回复,我会得到以下信息:

Observable { _subscribe: [Function (anonymous)] }
Run Code Online (Sandbox Code Playgroud)

我对 Nest.js 和 Observable 的概念都很陌生。如果有一个发出 HTTP 请求并访问响应数据的示例,我将不胜感激。

Jay*_*iel 45

如果您想让使用HttpService承诺而不是在RxJS Observable上使用,您可以使用lastValueFrom环绕调用this.httpService.post()。这会将 Observable 转换为 Promise,您可以await像往常一样使用它。否则,如果您只是返回可观察值,Nest 将为您处理等待响应。无论哪种方式,您都需要确保使用map((resp) => resp.data)您拥有的函数,这样您就不会在响应对象中得到循环数据(因为 Axios 的响应对象在设计上就是循环的)。

如果您正在尝试获取console.log()数据,您将需要tapmap以下形式使用

this.httpService.post(url, data, options).pipe(
  tap((resp) => console.log(resp)),
  map((resp) => resp.data),
  tap((data) =>  console.log(data)),
);
Run Code Online (Sandbox Code Playgroud)

tap本质上是一种间谍方法,用于挖掘可观察对象、查看数据并让它通过。它可以改变数据,但通常最好将其留给map或其他rxjs 运算符。


对于简单的await能力来说,这样的东西就足够了

const data = await lastValueFrom(
  this.httpService.post(url, data, options).pipe(
    map(resp => res.data)
  )
);
Run Code Online (Sandbox Code Playgroud)

对象类型示例AxiosRequestConfig(TypeScript)

const requestConfig: AxiosRequestConfig = {
  headers: {
    'Content-Type': 'YOUR_CONTENT_TYPE_HEADER',
  },
  params: {
    param1: 'YOUR_VALUE_HERE'
  },
};

const responseData = await lastValueFrom(
  this.httpService.post(requestUrl, null, requestConfig).pipe(
    map((response) => {
      return response.data;
    }),
  ),
);
Run Code Online (Sandbox Code Playgroud)