NestJS调用外部健康检查API时Observable无法解析问题求解
问题根因
- 你当前打印的
obj本质是未订阅的RxJS Observable对象,所以只会输出Observable内部结构,不会拿到实际的接口返回值。 - 出现
Converting circular structure to JSON错误的核心原因:- 注入了
@Res()对象后,Nest会默认你要手动处理响应逻辑,不再自动序列化方法返回值 - 如果你直接返回Observable、或者没有手动调用
res.send()就把Observable暴露给框架自动序列化,Observable内部的循环引用结构就会触发JSON转换报错
- 注入了
最优解决方案
Nest天生支持控制器方法直接返回Observable,框架会自动完成订阅、取值、序列化响应的全流程,不需要你手动处理订阅或者转Promise,最简改造代码如下:
// 移除不需要的@Res()注入 @Get('healthCheck') public healthCheck(@Req() req: Request) { // 直接返回Observable即可 return this.test(req); } test(req) { const testingURL = 'https://google.com'; return this.http.get(testingURL).pipe( map((obj: AxiosResponse) => obj.data ), // 这里可以直接打印拿到的响应数据,不需要额外订阅 tap(data => console.log('外部接口返回数据:', data)) ); }
如果你确实需要手动控制响应(自定义状态码、响应头等)
订阅写法
import { HttpStatus } from '@nestjs/common'; @Get('healthCheck') public healthCheck( @Req() req: Request, @Res() res: Response, ) { this.test(req).subscribe({ next: (data) => { console.log('健康检查成功,返回数据:', data); // 手动发送响应 res.status(HttpStatus.OK).send({ status: 'healthy', data }); }, error: (err) => { console.error('健康检查失败:', err.message); res.status(HttpStatus.SERVICE_UNAVAILABLE).send({ status: 'unhealthy' }); } }) }
Promise写法
RxJS 7+ 版本已废弃toPromise()方法,推荐使用firstValueFrom/lastValueFrom转换:
import { firstValueFrom } from 'rxjs'; import { HttpStatus } from '@nestjs/common'; @Get('healthCheck') public async healthCheck( @Req() req: Request, @Res() res: Response, ) { try { const data = await firstValueFrom(this.test(req)); console.log('健康检查成功,返回数据:', data); res.status(HttpStatus.OK).send({ status: 'healthy', data }); } catch (err) { console.error('健康检查失败:', err.message); res.status(HttpStatus.SERVICE_UNAVAILABLE).send({ status: 'unhealthy' }); } }
内容的提问来源于stack exchange,提问作者CAP
相关产品推荐
相关产品推荐

