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

Meteor部署Galaxy后服务端使用fs与webshot-node生成PDF报ENOENT错误

问题根因与修复方案

核心触发原因

你遇到的ENOENT报错本质是Galaxy部署环境的文件目录权限问题:

  • /app/bundle/programs/web.browser/app/是Meteor打包后的静态资源目录,Galaxy环境下该目录为只读权限,不允许写入临时文件
  • 本地开发环境下该目录可写,所以功能运行正常,部署后权限规则变化才触发报错
  • 你现有代码未处理webshot执行阶段的错误,webshot因无权限写入文件失败后,后续读文件逻辑直接抛出找不到文件的异常

修复步骤

1. 替换临时文件存储路径

不要写入静态资源目录,改用系统临时目录,该目录默认有读写权限:

// 删掉原来的meteorRoot、publicPath逻辑,替换为下面的代码
const publicPath = process.env.TMPDIR || '/tmp/';
const fileName = publicPath + "cv_resume.pdf";

临时目录的文件会被系统自动清理,你代码里本来也会在读取后调用unlinkSync删除文件,完全符合使用需求。

2. 补充webshot执行错误处理

现有代码未捕获webshot本身的执行错误,会导致问题排查难度提升,修改回调逻辑:

webshot(html_string, fileName, options, function (err) {
  // 先判断webshot执行是否出错
  if (err) {
    console.error('webshot生成PDF失败:', err);
    fut.throw(err);
    return;
  }
  fs.readFile(fileName, function (err, data) {
    if (err) {
      console.error('读取PDF文件失败:', err);
      fut.throw(err);
      return;
    }
    fs.unlinkSync(fileName);
    fut.return(data);
  });
});

3. 可选排查项

如果改完路径还是报错,检查webshot-node依赖的phantomjs二进制是否兼容Galaxy的Linux环境:

  • 确保package.json中声明了phantomjs相关依赖,不要依赖本地安装的二进制
  • 部署时触发一次依赖重装,避免本地提交的node_modules中包含Mac/Windows环境的二进制文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 11:36:03