无法在服务器端使用 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 托管)的主要内容,如果未能解决你的问题,请参考以下文章
更新到 Angular v6 - 找不到模块:错误:无法解析“fs”
如何将服务器端文件插入图像、fs.files 和 fs.chunks -GridFS (Ostrio/files)