【问题标题】:Rendering images in a webshot pdf on Meteor's Galaxy在 Meteor's Galaxy 上以 webshot pdf 格式渲染图像
【发布时间】:2016-04-22 17:53:47
【问题描述】:

我有一个 pdf,它是使用 webshot 从我的 Meteor 应用程序中的服务器端 html 文件呈现的。此 pdf 显示在浏览器中,还附加到要发送给各种用户的电子邮件中。自从迁移到 Meteor 的 Galaxy 平台后,我无法在 html 文件中呈现图像,并且电子邮件附件也无法正常工作。我的设置在带有 Ubuntu 14.04 的 Digital Ocean 以及我的本地主机上完美运行。它仍然在这两种环境下都能完美运行,但不适用于 Galaxy。 (值得注意的是我对邮件附件编程了解不多,但是用过Meteor的邮件包,基于mailcomposer)

pdf 呈现,所以我知道 phantomjs 正在运行,webshot 正在截取屏幕截图并将其显示为 pdf,所以我知道 webshot 正在运行。但是,图像不会呈现,并且在附加到电子邮件时,文件已损坏/无法正确发送。我已经尝试记录 html 以确保图像文件的 URL 都是正确的,并且它们在部署到 Galaxy 时是正确的,但它们不会使用 phantomjs/webshot 呈现。我使用meteorhacks:ssr 包在服务器上渲染html 文件,然后用phantomjs 读取它。

我已尝试就此联系 Galaxy 支持,但没有得到太多帮助。有没有其他人经历过这个?如果我需要,我什至很难确定导致问题提交请求请求的包。谢谢!

【问题讨论】:

  • 这些图片来自哪里?它们是在您的public 目录中动态生成还是静态生成?
  • 它们在我的公共目录中是静态的。就像我说的,它们在以前的环境中渲染,但是 Galaxy 容器中的某些东西导致了问题。

标签: javascript meteor phantomjs


【解决方案1】:

所以我发现了我的问题,我将与其他人分享,但我也会分享一些关于在 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) { // 调用回调 = true; // clearTimeout(timeoutID); // cb(new Error('' + data)) // } // });

执行这两项修改会将 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"
        },

这解决了通过 https 在我的 pdf 中加载静态图像的问题(注意:这在没有上述代码的情况下在 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 的其他人有所帮助。祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-16
    • 2012-05-28
    • 2014-09-18
    • 2014-02-03
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    相关资源
    最近更新 更多