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:ServerResponse.json()でJSON.stringify()stringify(/Users/francesco.borzi/sources/business-controller-rewrite/node_modules/express/lib/response.js:1119:12)で循環構造をJSONに変換します( /Users/francesco.borzi/sources/business-controller-rewrite/node_modules/express/lib/response.js:260:14)at 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)
この問題は、 axios ライブラリに起因しています。これを修正するには、data
プロパティを引き出す必要があります:
return this.httpService.post(...)
.pipe(
map(response => response.data),
);
問題は、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;
});
}
[〜#〜] update [〜#〜]
新しい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;
}));
}