node.js - NestJS returnerer resultatet av en HTTP-forespørsel


I min NestJS-applikasjon ønsker jeg å returnere resultatet av et HTTP-kall.

Følger eksemplet fra NestJS HTTP-modulen, gjør jeg ganske enkelt:

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

Men fra klienten får jeg 500, og serverkonsollen sier:

TypeError: Konverterer sirkulær struktur til JSON ved JSON.stringify() ved stringify (/Users/francesco.borzi/sources/business-controller-rewrite/node_modules/express/lib/response.js:1119:12) ved ServerResponse.json (/Users/francesco.borzi/sources/business-controller-rewrite/node_modules/express/lib/response.js:260:14) ved ExpressAdapter.reply (/Users/francesco.borzi/sources/business-controller-rewrite/node_modules/@nestjs/core/adapters/express-adapter.js:41:52) ved RouterResponseController.apply (/Users/francesco.borzi/sources/business-controller-rewrite/node_modules/@nestjs/core/router/router-response-controller.js:11:36) ved ved process._tickCallback (internal/process/next_tick.js:182:7)

Svar #1

Dette problemet kommer fra axios-biblioteket. For å fikse det, må du hente ut data-egenskapen:

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

Svar #2

Problemet ser ut til å stamme fra det faktum at vi prøver å returnere et Response-objekt direkte, og det er sirkelaktig av natur. Jeg er ikke sikker på den riktige måten å implementere dette på, men jeg klarte å komme rundt det ved å bruke axios direkte, pakke ut løftet og returnere bare dataene.

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

OPPDATERING

Jeg innså at jeg bare kunne gjøre det samme med Observable som returneres fra httpService ved å bruke den nye rxjs pipe-metoden, så det er sannsynligvis den bedre måten å gjøre det på.

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

Relaterte artikler