在Meteor的Galaxy上以webshot pdf渲染图像

时间:2016-04-22 17:53:48

标签: javascript meteor phantomjs

我有一个使用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对此的支持,但没有多少帮助。还有其他人经历过这个吗?如果需要的话,我甚至努力查明导致问题的包提交拉取请求。谢谢!

1 个答案:

答案 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的其他人有帮助。祝你好运!