NestJS返回HTTP请求的结果

时间:2018-05-15 17:00:44

标签: node.js typescript rxjs axios nestjs

在我的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)       在       at process._tickCallback(internal / process / next_tick.js:182:7)

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分: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 await this.httpService.post('https://api.example.com/authenticate_user',
      params,
      {
        headers: {
          'Content-Type': 'application/json',
        },
      }).pipe(map((res) => {
    return res.data;
  }));
}