在我的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)
答案 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;
}));
}