所以我发现了我的问题,我将与其他人分享,但我也会分享一些关于在 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 的其他人有所帮助。祝你好运!