NestJS 返回 HTTP 请求的结果

新手上路,请多包涵

在我的 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(...);
  }
}

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

TypeError:在 ServerResponse.json (/Users/francesco.borzi/sources/business-controller-rewrite/node_modules/express/lib/response.js:1119:12) 处的 JSON.stringify () 处将循环结构转换为 JSON ( /Users/francesco.borzi/sources/business-controller-rewrite/node_modules/express/lib/response.js:260:14) 在 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) 在 process._tickCallback (internal/process/next_tick.js:182:7)

原文由 Francesco Borzi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 919
2 个回答

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

 return this.httpService.post(...)
  .pipe(
    map(response => response.data),
  );

原文由 Kamil Myśliwiec 发布,翻译遵循 CC BY-SA 4.0 许可协议

问题似乎源于我们试图直接返回一个 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;
    });
}

更新

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

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

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

原文由 andyrue 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题