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

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")));
    
  • 临时禁用缓存,排除缓存导致的不一致:
    app.use("/pdfs", express.static(path.join(__dirname, "pdfs"), {
      maxAge: 0,
      etag: false,
      lastModified: false
    }));
    
    部分设备可能缓存了早期的404响应,禁用缓存后再测试是否还存在差异。

3. 网络层(Cloudflare/iptables)排查

  • Cloudflare侧:
    • 检查缓存规则:如果开启了CF缓存,确认是否缓存了404响应,可临时暂停CF缓存测试,看问题是否消失。
    • 检查防火墙规则:有没有IP段或地区被拦截,导致部分设备请求无法到达服务器。
  • iptables侧:
    • 检查端口转发规则:如果用了非80/443端口,确认iptables是否正确转发了该端口的流量,且没有针对某些IP的过滤规则。
    • 确认端口对外开放状态:部分网络环境(如公司、校园网)会屏蔽非标准端口,导致这些网络下的设备无法访问,建议改用80/443端口,或确认端口在所有测试网络中都能正常访问。

4. 日志辅助排查

  • 接入日志中间件(如morgan)记录请求细节:
    const morgan = require('morgan');
    app.use(morgan(':remote-addr :method :url :status :res[content-length] - :response-time ms'));
    
    通过日志对比返回404和正常请求的IP、响应时间等信息,定位差异原因(比如特定IP段被拦截、请求路径异常等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 04:35:22