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

Node.js(Express)服务cURL请求正常,Postman/浏览器请求无限加载求助

Node.js Express服务器仅响应cURL,Postman/浏览器请求无限加载问题排查

问题概述

Node.js(Express)服务器可正常响应cURL发起的请求,但通过Postman或浏览器请求时会无限加载,无任何错误提示,调整Postman设置后问题仍未解决。

相关代码及信息

服务器核心代码

const app = express();
app.use(cors());
app.use(express.json());
app.use(express.static(path.resolve(__dirname, 'static')))
app.use(fileUpload({}))
app.use('/api', router)

app.use(errorHandler)

const start = async () => {
    try {
        await sequelize.authenticate();
        await sequelize.sync();
        app.listen(PORT, () => {
            console.log(`Server started on port ${PORT}`);
        });
    } catch (e) {
        console.log(e);
    }
};

start();

cURL请求结果

root@fnrnacxqna:~# curl http://5.35.95.237:5000/api/client
[]root@fnrnacxqna:~#

服务器响应日志

Executing (default): SELECT "id", "name", "img", "createdAt", "updatedAt" FROM "clients" AS "client";

端口监听检查结果

root@fnrnacxqna:~# sudo lsof -i -P -n | grep LISTEN
systemd-r  3733 systemd-resolve   14u  IPv4  35965      0t0  TCP 127.0.0.53:53 (LISTEN)
sshd      13689            root    3u  IPv4  44183      0t0  TCP *:22 (LISTEN)
sshd      13689            root    4u  IPv6  44194      0t0  TCP *:22 (LISTEN)
nginx     25349            root    6u  IPv4  88138      0t0  TCP *:80 (LISTEN)
nginx     25349            root    7u  IPv6  88139      0t0  TCP *:80 (LISTEN)
nginx     25350        www-data    6u  IPv4  88138      0t0  TCP *:80 (LISTEN)
nginx     25350        www-data    7u  IPv6  88139      0t0  TCP *:80 (LISTEN)
postgres  31592        postgres    5u  IPv4 128205      0t0  TCP *:5432 (LISTEN)
postgres  31592        postgres    6u  IPv6 128206      0t0  TCP *:5432 (LISTEN)
node      33352            root   24u  IPv6 139994      0t0  TCP *:5000 (LISTEN)
root@fnrnacxqna:~#

可能的原因及解决方向

1. IPv6监听兼容性问题

从端口监听结果可见,Node进程仅监听了IPv6套接字(TCP *:5000 (LISTEN)对应IPv6)。部分客户端(如浏览器、部分Postman环境)可能优先使用IPv4发起请求,导致请求无法被服务器接收,进入无限等待状态。而cURL在本地环境可能自动适配了IPv6,因此能正常响应。

解决方式:修改app.listen配置,明确绑定IPv4地址以兼容两种协议:

app.listen(PORT, '0.0.0.0', () => {
    console.log(`Server started on port ${PORT}`);
});

2. 请求头差异引发中间件阻塞

cURL默认请求头与浏览器/Postman差异较大,比如Accept、Content-Type等字段。服务器使用的fileUpload、express.json等中间件,可能因特定请求头触发异常逻辑,导致请求挂起。

排查方向:

  • 临时移除fileUpload中间件,测试Postman/浏览器是否能正常响应,确认是否是该中间件导致的问题
  • 为express.json()添加strict: false配置,放宽对非JSON格式请求头的解析规则

3. CORS配置隐性问题

虽然使用了cors()默认配置,但部分复杂请求场景(如带自定义头的请求、OPTIONS预检请求)可能无法被覆盖,导致浏览器因预检请求未响应而挂起。

解决方式:显式配置CORS规则,覆盖常见场景:

app.use(cors({
    origin: '*', // 测试用,生产环境替换为具体域名
    credentials: true,
    allowedHeaders: ['Content-Type', 'Authorization'],
    methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS']
}));

4. 中间件顺序冲突

当前express.static中间件在API路由之前,若请求路径与静态资源目录下的文件路径存在隐性冲突,可能导致请求被静态资源中间件拦截,进入异常处理流程。

解决方式:调整中间件顺序,让API路由优先处理请求:

const app = express();
app.use(cors());
app.use(express.json());
app.use(fileUpload({}));
// API路由提前
app.use('/api', router);
// 静态资源中间件后置
app.use(express.static(path.resolve(__dirname, 'static')));

app.use(errorHandler);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 20:39:55