NestJS возвращает результат HTTP-запроса - PullRequest
0 голосов
/ 15 мая 2018

В моем приложении 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: Преобразование круговой структуры в 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 голосов
/ 16 мая 2018

Эта проблема возникает из библиотеки axios . Чтобы это исправить, вы должны извлечь свойство data:

return this.httpService.post(...)
  .pipe(
    map(response => response.data),
  );
0 голосов
/ 16 мая 2018

Кажется, что проблема связана с тем фактом, что мы пытаемся вернуть объект 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;
    });
}

ОБНОВЛЕНИЕ

Я понял, что мог бы сделать то же самое с Observable, возвращаемым из httpService, используя новый метод канала rxjs, так что, вероятно, это лучший способ сделать это.

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