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

ExpressJS延迟200秒返回响应时出现err_empty_response(324状态码)求助

解决ExpressJS中长延迟响应导致的ERR_EMPTY_RESPONSE(状态码324)问题

这个问题我之前帮不少开发者排查过,本质是超时机制在各个环节的限制导致的——200秒的延迟远远超过了浏览器、Express服务器甚至反向代理的默认超时阈值,最终连接被提前断开,就出现了ERR_EMPTY_RESPONSE(状态码324)的错误。下面给你几个针对性的解决方案:

1. 调整服务器及代理的超时配置

首先得把所有可能截断连接的超时时间都调大,至少要超过你的200秒延迟:

Express服务器本身的超时设置

Express依赖的Node.js HTTP服务器默认超时是120秒(120000毫秒),你的200秒延迟已经超过了这个值,需要手动修改:

const express = require('express');
const app = express();

// 启动服务器后设置超时时间(比如设为300秒)
const server = app.listen(3000, () => {
  console.log('Server running on port 3000');
});
server.timeout = 300000; // 300000毫秒 = 300秒

反向代理(如Nginx)的超时调整

如果你的Express服务前面挂了Nginx之类的代理,还要同步调整Nginx的超时参数,不然代理会提前断开连接:

location / {
    proxy_pass http://your-express-server-address;
    proxy_connect_timeout 300s;   # 连接超时
    proxy_send_timeout 300s;      # 发送数据超时
    proxy_read_timeout 300s;      # 读取响应超时
}

2. 替换长延迟同步响应为异步任务模式

生产环境中不建议依赖长超时的同步请求,这会占用服务器连接资源,还容易受网络波动影响。更合理的做法是用异步任务队列处理耗时操作,再让客户端通过轮询或WebSocket获取结果:

比如用bull这个任务队列库实现:

const express = require('express');
const Queue = require('bull');
const app = express();

// 创建任务队列
const longTaskQueue = new Queue('long-running-tasks');

// 接收任务请求,返回任务ID
app.get('/fake-timeout', async (req, res) => {
  const job = await longTaskQueue.add({});
  res.json({ jobId: job.id, message: '任务已启动,稍后查询结果' });
});

// 后台处理耗时任务
longTaskQueue.process(async (job) => {
  // 模拟200秒的耗时操作
  await new Promise(resolve => setTimeout(resolve, 200000));
  return { success: true };
});

// 提供查询任务结果的接口
app.get('/task-result/:jobId', async (req, res) => {
  const job = await longTaskQueue.getJob(req.params.jobId);
  if (!job) {
    return res.status(404).json({ error: '任务不存在' });
  }

  const jobState = await job.getState();
  const result = job.returnvalue;
  res.json({ status: jobState, result });
});

const server = app.listen(3000);
server.timeout = 300000;

3. 客户端侧的适配

浏览器本身也有默认的超时限制(大多在120秒左右),如果必须用长连接,可以用Fetch API的keepalive选项,或者直接用WebSocket维持双向连接,避免被浏览器主动断开:

// 示例:用Fetch发送长连接请求(部分浏览器支持)
fetch('/fake-timeout', { keepalive: true })
  .then(res => res.json())
  .then(data => console.log(data))
  .catch(err => console.error(err));

注意事项

  • 尽量不要在生产环境设置过长的超时时间,这会增加服务器的资源占用风险;
  • 所有中间环节(浏览器、代理、服务器)的超时必须统一调整,否则某一环超时都会触发ERR_EMPTY_RESPONSE;
  • 异步任务模式是生产环境处理长耗时操作的标准方案,能大幅提升服务的稳定性和并发能力。

内容的提问来源于stack exchange,提问作者user1247071

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:14:02