Express.js静态PDF下载异常求助:部分设备报404,结果不一致
排查思路与解决方案
先从代码和本地服务层面入手排查,再逐步延伸到网络层:
1. 确保文件写入的可靠性
- 给
fs.writeFileSync加上错误捕获与写入后验证,避免静默失败:
注意:固定文件名try { const filePath = path.join(__dirname, "pdfs", "2312312312.pdf"); fs.writeFileSync(filePath, doc.output(), "binary"); // 验证文件是否有效生成 const stats = fs.statSync(filePath); if (stats.size === 0) { console.error("生成的PDF为空文件:", filePath); } } catch (err) { console.error("写入PDF失败:", err); }2312312312.pdf容易引发并发写入冲突,如果是多请求场景,建议给每个请求生成唯一文件名,避免文件被覆盖导致访问异常。 - 检查文件与目录权限:确保服务器进程对
pdfs目录有读写权限,生成的PDF文件权限设为644、目录权限设为755(可通过chmod命令调整)。
2. 修正Express静态资源配置
- 去掉路径中的多余斜杠,避免拼接异常:
app.use("/pdfs", express.static(path.join(__dirname, "pdfs"))); - 临时禁用缓存,排除缓存导致的不一致:
部分设备可能缓存了早期的404响应,禁用缓存后再测试是否还存在差异。app.use("/pdfs", express.static(path.join(__dirname, "pdfs"), { maxAge: 0, etag: false, lastModified: false }));
3. 网络层(Cloudflare/iptables)排查
- Cloudflare侧:
- 检查缓存规则:如果开启了CF缓存,确认是否缓存了404响应,可临时暂停CF缓存测试,看问题是否消失。
- 检查防火墙规则:有没有IP段或地区被拦截,导致部分设备请求无法到达服务器。
- iptables侧:
- 检查端口转发规则:如果用了非80/443端口,确认iptables是否正确转发了该端口的流量,且没有针对某些IP的过滤规则。
- 确认端口对外开放状态:部分网络环境(如公司、校园网)会屏蔽非标准端口,导致这些网络下的设备无法访问,建议改用80/443端口,或确认端口在所有测试网络中都能正常访问。
4. 日志辅助排查
- 接入日志中间件(如morgan)记录请求细节:
通过日志对比返回404和正常请求的IP、响应时间等信息,定位差异原因(比如特定IP段被拦截、请求路径异常等)。const morgan = require('morgan'); app.use(morgan(':remote-addr :method :url :status :res[content-length] - :response-time ms'));
内容的提问来源于stack exchange,提问作者Abd
相关产品推荐
相关产品推荐

