NestJS返回HTTP请求的结果

Fra*_*rzi 9 node.js rxjs typescript axios nestjs

在我的NestJS应用程序中,我想返回http调用的结果.

按照NestJS HTTP模块的例子,我正在做的只是:

import { Controller, HttpService, Post } from '@nestjs/common';
import { AxiosResponse } from '@nestjs/common/http/interfaces/axios.interfaces';
import { Observable } from 'rxjs/internal/Observable';

@Controller('authenticate')
export class AuthController {

  constructor(private readonly httpService: HttpService) {}

  @Post()
  authenticate(): Observable<AxiosResponse<any>> {
    return this.httpService.post(...);
  }
}
Run Code Online (Sandbox Code Playgroud)

但是从客户端我得到500并且服务器控制台说:

TypeError:在ServerResponse.json上的stringify(/Users/francesco.borzi/sources/business-controller-rewrite/node_modules/express/lib/response.js:1119:12)将JSON.stringify()处的循环结构转换为JSON(在ExpressAdapter.reply /Users/francesco.borzi/sources/business-controller-rewrite/node_modules /@nestjs/core/adapters/express-adapter.js:41:52)在RouterResponseController.apply(/Users/francesco.borzi/sources/business-controller-rewrite/node_modules/@nestjs/core/router/router-response -controller.js:11:36)at process._tickCallback(internal/process/next_tick.js:182:7)

Kam*_*iec 11

此问题来自axios库。为了解决这个问题,您必须拉出该data属性:

return this.httpService.post(...)
  .pipe(
    map(response => response.data),
  );
Run Code Online (Sandbox Code Playgroud)

  • 所以我不得不在我的身上学习这个。但是现在我想在出错的情况下推送原始的 HTTP 状态代码。有小费吗? (2认同)

and*_*rue 7

问题似乎源于这样一个事实,即我们试图直接返回一个 Response 对象,这本质上是循环的。我不确定实现这一点的正确方法,但我能够通过直接使用 axios、解开承诺并仅返回数据来绕过它。

@Post('login')
  async authenticateUser(@Body() LoginDto) {
    const params = JSON.stringify(LoginDto);

    return await axios.post('https://api.example.com/authenticate_user',
      params,
      {
        headers: {
          'Content-Type': 'application/json',
        },
      }).then((res) => {
          return res.data;
    });
}
Run Code Online (Sandbox Code Playgroud)

更新

我意识到我可以对从httpService使用新的 rxjs 管道方法返回的 Observable 做同样的事情,所以这可能是更好的方法。

@Post('login')
async authenticateUser(@Body() LoginDto) {
    const params = JSON.stringify(LoginDto);

    return await this.httpService.post('https://api.example.com/authenticate_user',
      params,
      {
        headers: {
          'Content-Type': 'application/json',
        },
      }).pipe(map((res) => {
    return res.data;
  }));
}
Run Code Online (Sandbox Code Playgroud)

  • @MuhammedMoussa 在我的情况下,身份验证 api 位于不同的服务器上。 (2认同)