You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NestJS调用外部健康检查API时Observable无法解析问题求解

问题根因

  1. 你当前打印的obj本质是未订阅的RxJS Observable对象,所以只会输出Observable内部结构,不会拿到实际的接口返回值。
  2. 出现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 11:06:03