Dans mon application NestJS, je souhaite renvoyer le résultat d'un appel http.
Suivant l'exemple du module HTTP NestJS , je fais simplement ceci:
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(...);
}
}
Cependant, du client, je reçois 500 et la console du serveur dit:
TypeError: Conversion de structure circulaire en JSON à JSON.stringify () at stringify (/Users/francesco.borzi/sources/business-controller-rewrite/node_modules/express/lib/response.js:1119:12) sur ServerResponse.json (/Users/francesco.borzi/sources/business-controller-rewrite/node_modules/express/lib/response.js:260:14) sur ExpressAdapter.reply (/Users/francesco.borzi/sources/business-controller-rewrite/node_modules/@nestjs/core/adapters/express-adapter.js:41:52) at 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)
Ce problème provient de la bibliothèque axios . Pour résoudre ce problème, vous devez extraire la propriété data
:
return this.httpService.post(...)
.pipe(
map(response => response.data),
);
Le problème semble provenir du fait que nous essayons de renvoyer directement un objet Response, qui est par nature circulaire. Je ne suis pas sûr de la bonne façon de mettre en œuvre cela, mais j'ai pu contourner le problème en utilisant directement axios, en déroulant la promesse et en ne renvoyant que les données.
@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;
});
}
METTRE &AGRAVE; JOUR
J'ai réalisé que je pouvais simplement faire la même chose pour que l'Observable soit renvoyé de httpService
en utilisant la nouvelle méthode de pipe rxjs, c'est donc probablement la meilleure façon de le faire.
@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;
}));
}