NestJS 返回 HTTP 请求的结果

Posted

技术标签:

【中文标题】NestJS 返回 HTTP 请求的结果【英文标题】:NestJS returning the result of an HTTP request 【发布时间】:2018-10-25 14:38:45 【问题描述】:

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

按照NestJS HTTP module的例子,我所做的只是:

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:将循环结构转换为 JSON 在 JSON.stringify() 在 stringify (/Users/francesco.borzi/sources/business-controller-rewrite/node_modules/express/lib/response.js:1119:12) 在 ServerResponse.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)

【问题讨论】:

可能 httpService 返回了一些无效的 JSON,而 NestJS (Express) 会因为无法转换而抛出错误。尝试用 httpService 调用一些简单的东西,也许是简单的测试 GET。 据我了解,NestJS 应该会自动转换为 json.. 对吗? 是的,它应该默认自动转换。 当我遇到同样的事情时,我尝试使用另一个我 100% 肯定的来源进行测试,它返回有效的 json,但它仍然给出相同的错误。使用 GET 时结果相同。 【参考方案1】:

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

@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;
  ));

【讨论】:

@andyrune。抱歉,我只是想指出异步等待不适用于 Observables。它仅适用于承诺。我相信你必须将你的 observable 转换为一个 promise,然后使用 async/await。 @andyrune,为什么控制器在这里,调用 api 并点击另一个 api,而不是直接从数据库返回数据? @MuhammedMoussa 在我的情况下,身份验证 api 在不同的服务器上。 这行得通,但 imo 真的很难看。为什么以这种奇怪的方式实现 http 请求? 当我尝试 console.log 响应时没有得到任何响应【参考方案2】:

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

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

【讨论】:

所以我必须在我的 on 上学习这个。但是现在我想在出错的情况下推送原始的 HTTP 状态代码。有什么建议吗? 非常感谢,今天还没有修复

以上是关于NestJS 返回 HTTP 请求的结果的主要内容,如果未能解决你的问题,请参考以下文章

为 NestJs GraphQL 查询装饰器设置多种返回类型

异步处理http请求同步返回结果

Nestjs Mongodb 总是返回空数组

用PHP怎么发送HTTP POST 请求。怎么获得返回结果。

NestJS:返回一个字符串

如何使用返回多个项目的 TypeORM 设置 Nestjs 查询?