无法在服务器端使用 fs 和 webshot 与 Meteor(galxy 托管)

Posted

技术标签:

【中文标题】无法在服务器端使用 fs 和 webshot 与 Meteor(galxy 托管)【英文标题】:Unable to use fs and and webshot with Meteor on server side (galxy hosted) 【发布时间】:2021-12-16 07:20:16 【问题描述】:

我目前正在galaxy 上运行一个基于用户输入创建PDF 的流星应用程序。

我一直在使用 webshot-node 和 FS 来临时保存 PDF,然后在用户端直接下载。

由于我解决了一些其他错误,我再次在 Galaxy 上部署了新项目,但现在无法再生成 PDF(这部分代码没有任何更改)。

我得到的错误如下:

Error: ENOENT: no such file or directory, open /app/bundle/programs/web.browser/app/cv_resume.pdf 
errno: -2,
code: 'ENOENT',
syscall: 'open',
path: '/app/bundle/programs/web.browser/app/cv_resume.pdf'

如上所述,我在生成 PDF 时没有更改任何内容,所以我想知道你们中是否有人在服务器端使用 webshot 和 FS 时遇到类似错误。

顺便说一句,它在我的本地机器上运行良好。

哦,这是一代的代码,以防有人想尝试一下:

var myDocument1 = Personalinfo.findOne( email: creator );
      // SETUP
      // Grab required packages
      var fs = Npm.require('fs');
      var Future = Npm.require('fibers/future');
      var webshot = Npm.require('webshot-node');
      var fut = new Future();
      var meteorRoot = fs.realpathSync(process.cwd() + "/../" );
      var publicPath = meteorRoot + "/web.browser/app/";
      var fileName = publicPath + "cv_resume.pdf";

      // GENERATE html STRING
      var css = Assets.getText('style.css');
      s-s-r.compileTemplate('layout', Assets.getText('layout.html'));
      Template.layout.helpers(
        getDocType: function () 
          return "<!DOCTYPE html>";
        
      );
      s-s-r.compileTemplate('resume', Assets.getText('resume.html'));

      // PREPARE DATA
      var html_string = s-s-r.render('layout', 
        css: css,
        template: "resume",
        data: myDocument1
      );

      var options = 
        "paperSize": 
          "format": "A4",
          "orientation": "portrait",
          "margin": "0.8cm"
        ,
        siteType: 'html'
      ;

      // Commence Webshot
      webshot(html_string, fileName, options, function (err) 
        fs.readFile(fileName, function (err, data) 
          if (err) 
            return console.error(err);
          
          fs.unlinkSync(fileName);
          fut.return(data);
        );
      );
      
      let pdfData = fut.wait();
      let base64String = Buffer.from(pdfData).toString('base64');
      if (fullName != "") 
        return [base64String, fullName];
       else 
        return base64String;
      

希望有人可以帮助我,我已经被这个问题困扰了很长时间了。 如果有人需要更多信息,随时可用。

【问题讨论】:

/app/bundle/programs/web.browser/app/cv_resume.pdf 存在吗? meteorRoot = fs.realpathSync(process.cwd() + "/../" ); 对我来说似乎很奇怪。 Galaxy 上的东西真的是这样托管的吗?你能依赖它吗? 另外,cv_resume.pdf 是如何生成并放置在服务器上的?这是静态资产吗?如果是这样,那么使用Assets 可能是更好的解决方案,因为它不依赖于您必须弄清楚服务器如何布置文件。 嗨@ChristianFritz,感谢您的回答。这条路径实际上是fs.realathSync 给我的,公平地说,我不知道我是否可以依赖它,我在 Galaxy 文档中没有找到任何相关文档。 cv_resume.pdf 曾经生成过,但现在不再生成了,这看起来很奇怪。如果您能帮我使用Assets,我将不胜感激,因为我从未使用过它,也不知道该怎么做。 哦@ChristianFritz 和web.browser/app/ 是在本地机器上使用的。 【参考方案1】:

感谢您的澄清。似乎您只需要一个具有写入权限的文件夹,webshot 可以在其中放置 pdf,然后您可以从中再次阅读它。在这种情况下,只需使用/tmp

var publicPath = "/tmp/";
var fileName = publicPath + "cv_resume.pdf";

更新以使用 /tmp,因此您无需先创建文件夹(在代码中)。

【讨论】:

不幸的是它仍然不起作用。我仍然遇到与以前相同的错误ENOENT: no such file or directory. open '/tmp/webshot/cv_resume.pdf' 我想知道是否有任何方法可以在客户端而不是服务器端使用 webshot。或者也许使用其他东西从 HTML/CSS 页面生成 PDF? 您是否创建了文件夹? 根据 Galaxy 的文档,不需要创建它,因为所有容器都对 /tmp/ 文件夹具有读/写权限。 " 应用程序容器被授予对 /tmp 目录和 /tmp 子目录的读/写访问权限。应用程序容器没有对 /root 目录或 $HOME 目录的读/写访问权限。" 是的,但之前我的回答使用了/tmp/webshot,一开始并不存在。现在只使用/tmp/ 可以吗? 不,不幸的是。我想知道这是否是与fs.readFile 一样的异步问题我尝试阅读尚未创建的网络截图?

以上是关于无法在服务器端使用 fs 和 webshot 与 Meteor(galxy 托管)的主要内容,如果未能解决你的问题,请参考以下文章

[错误:PhantomJS退出并返回值为127]

更新到 Angular v6 - 找不到模块:错误:无法解析“fs”

如何将服务器端文件插入图像、fs.files 和 fs.chunks -GridFS (Ostrio/files)

在 DigitalOcean Ubuntu 14.04 中的 Meteor 上的 Webshot 失败

无法将节点 fs 模块与 k6 一起使用

R从受密码保护的网站截图