我有一个使用webshot从我的Meteor应用程序中的服务器端html文件呈现的pdf。此pdf显示在浏览器中,并附加到要发送给各个用户的电子邮件中。由于迁移到Meteor的Galaxy平台,我无法在html文件中呈现图像,并且电子邮件附件无法正常工作。我的设置在数字海洋上与Ubuntu 14.04以及我的本地主机上完美配合。它仍适用于这两种环境,但不适用于Galaxy。 (值得注意的是,我对编写电子邮件附件不太了解,但使用的是基于mailcomposer的Meteor的电子邮件包)
pdf呈现,所以我知道phantomjs正在运行,webshot正在截取并将其显示为pdf,所以我知道webshot正在运行。但是,图像不会呈现,当附加到电子邮件时,文件已损坏/无法正确发送。我已经尝试记录html以确保图像文件的URL都是正确的,并且它们在部署到Galaxy时,但它们只是不会使用phantomjs / webshot进行渲染。我正在使用meteorhacks:ssr包在服务器上呈现html文件,然后用phantomjs读取它。
我已经尝试过联系Galaxy对此的支持,但没有多少帮助。还有其他人经历过这个吗?如果需要的话,我甚至努力查明导致问题的包提交拉取请求。谢谢!
答案 0 :(得分:0)
所以我想出了我的问题,我将与其他人分享,但我也会在Galaxy服务器上运行的应用程序中分享一些关于调试webshot的指示。
首先,webshot默认不会将错误传递给Galaxy的日志,因为它在一个衍生的node.js进程上运行,所以你需要在'project_path / .meteor / local / isopacks / npm-中更改这一行。 container / npm / node_modules / webshot / lib / webshot.js'文件(注意,我还在使用Meteor 1.2,所以这是你的npm webshot包所在的位置):
// webshot.js line 201 - add , {stdio: "inherit"} to spawn method
var phantomProc = crossSpawn.spawn(options.phantomPath, phantomArgs, {stdio: "inherit"});
这会将所有日志从生成的进程传递到您的控制台。除此之外,请在同一文件中注释掉以下代码:
// comment out lines 234-239 // phantomProc.stderr.on('data',function(data){ // if(options.errorIfJSException){ // calledCallback = true; // clearTimeout(timeoutID); // cb(新错误(''+数据)) //} //});
执行这两项修改会将phantomjs进程中的日志打印到Galaxy容器中。除此之外,您还需要修改位于同一目录中的webshot.phantom.js脚本以打印到控制台以进行调试。这是您要修改的脚本,但是您认为适合查找问题,但phantomjs docs建议使用phantom callbacks调试正在加载的网页中的错误,例如:
page.onResourceError = function(resourceError) {
console.log('Unable to load resource (#' + resourceError.id + 'URL:' + resourceError.url + ')');
console.log('Error code: ' + resourceError.errorCode + '. Description: ' + resourceError.errorString);
};
对于我的特定问题,我遇到了SSL握手问题:
Error code: 6. Description: SSL handshake failed
要解决此问题,我必须将following code添加到我的webshot选项对象:
phantomConfig: {
"ignore-ssl-errors": "true",
"ssl-protocol": "any"
},
这解决了在我的pdf上通过https加载静态图像的问题(注意:这在Digital Ocean上没有上面的代码时正常工作,我不确定Galaxy容器上的SSL配置有什么不同)。
此外,我在将pdf正确附加到我的应用发送的电子邮件时遇到了问题。事实证明,使用mailcomposer attachments filePath对象中的Meteor.absoluteUrl()正确呈现电子邮件的URL是个问题。我不知道为什么Meteor.absoluteUrl()没有在电子邮件附件中正确地在Galaxy上呈现我的应用程序的url,因为Meteor.absoluteUrl()在我的应用程序的其他地方工作,并且它在Digital Ocean上运行,但它没有'在这里工作。当我将附件对象切换到硬编码的URL时,它工作正常,因此如果您遇到问题,可能需要检查。
我知道有不少Meteor开发人员使用webshot在他们的应用程序中创建pdf,我相信将来有些人会迁移到Galaxy,所以希望这对决定转换到Galaxy的其他人有帮助。祝你好运!