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

NestJS API网关GET请求正常,但POST请求无限挂起的问题排查求助

NestJS API网关GET请求正常,但POST请求无限挂起的问题排查求助

我正在用NestJS构建微服务架构,有一个API网关负责将请求代理到不同的服务(Order、Email、User)。

GET请求一切正常,但发送到Email服务的POST请求会无限挂起,最终因socket hang up失败。

环境配置

API网关里有一个简单的路由配置:

export const routes = {
 Order: 'http://localhost:3001/api/Order',
 Email: 'http://localhost:3002/api/Email',
 User: 'http://localhost:3003/api/User',
};

下面是API网关负责代理请求的控制器代码:

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @All('api/:service/*')
  async proxy(
    @Param('service') service: string,
    @Req() req: Request,
    @Res() res: Response,
    @Body() body: any,
  ) {
    console.log('Service:', service);
    const path = req.url.replace(`/api/${service}`, '');
    
    try {
      const response = await this.appService.forwardRequest(req, res, body, path, service);
      res.status(response.status).json(response.data);
    } catch (error) {
      console.error('Proxy request failed:', error);
      return res.status(500).json({ message: 'Error forwarding request' });
    }
  }
}

API网关的服务层用axios(@nestjs/axios)转发请求:

async forwardRequest(
  req: Request,
  res: Response,
  body: any,
  path: string,
  service: string,
): Promise<AxiosResponse> {
  const baseURL = routes[service];
  const url = baseURL + path;
  const configuredHeaders = this.httpHelper.configureHeaders(req.headers);
  
  console.log('Forwarding request:', {
    method: req.method,
    url,
    headers: configuredHeaders,
    body: JSON.stringify(body),
  });

  return lastValueFrom(
    this.http.request({
      method: req.method,
      url: url,
      data: body,
      headers: configuredHeaders,
      timeout: 10000, // 10 seconds
    }),
  );
}

问题现象

  • GET请求完全正常!
  • 发送到http://localhost:3000/api/Email/SendEmail的POST请求会无限挂起(其他POST请求也是如此)。
  • 但直接调用http://localhost:3002/api/Email/SendEmail却能正常工作。

我在Email服务里创建了一个测试用的GET端点:

@Get('SendEmail')
sendEmailTest() {
  console.log('Test log!');
  return { message: 'Email sent!' };
}

通过API网关访问这个端点完全正常,说明问题只出在POST请求上。

已尝试的排查步骤

  • 检查Email服务是否收到请求 → 没有收到(所以问题大概率在API网关)。
  • 在main.ts里启用了express.json()和express.urlencoded() → 还是挂起。
  • 在forwardRequest()里打印请求体 → 请求体是存在的。
  • 给Axios加了10秒超时 → 只是从无限挂起变成10秒后失败。

想请教大家:为什么API网关代理GET请求正常,但POST请求会挂起?是什么原因导致NestJS在代理POST请求时无限挂起?

备注:内容来源于stack exchange,提问作者apoleyta97

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 10:33:09