在Heroku上运行Phantomjs +节点时遇到问题

时间:2012-09-04 03:05:29

标签: node.js heroku phantomjs

我已成功让Phantomjs在Heroku上工作,但现在我遇到了node.js的phantomjs-node接口问题(参见https://github.com/sgentle/phantomjs-node)。

当我试图初始化Phantom时,我看到了10-15秒的延迟然后:

> phantom stdout: ReferenceError: Can't find variable: socket

phantom stdout:   phantomjs://webpage.evaluate():1
  phantomjs://webpage.evaluate():1
  phantomjs://webpage.evaluate():1

您可以通过以下步骤或在https://github.com/matellis/phantom-test

下拉我的测试应用来重现此问题
git init phantom-test
cd phantom-test
heroku apps:create
# create node app as per Heroku instructions here https://devcenter.heroku.com/articles/nodejs
# copy bin and lib folders from http://phantomjs.googlecode.com/files/phantomjs-1.6.1-linux-x86_64-dynamic.tar.bz2 into root of your new project
# if you don't do this step you'll get an error "phantom stderr: execvp(): No such file or directory"
git add .
git commit -m "init"
git push heroku

测试你的应用程序已经出现,第三行到最后一行会告诉你URL,它应该是这样的:

http://fathomless-ravine-5563.herokuapp.com deployed to Heroku

如果成功,你应该看到Hello World!在浏览器中。

现在,从与Heroku应用程序相同的文件夹运行:

heroku run node

在节点提示符处尝试以下操作:

phantom = require('phantom');
x = phantom.create();

等待10-15秒,你应该看到错误。从这一点来看,没有任何作用。

这应该输出文件foo.png

x = phantom.create(function(ph){ph.createPage(function(page){ page.open('http://bbcnews.com', function(status){ page.render('foo.png', function(result) {ph.exit()}); }); }); });

要验证Phantomjs在Heroku上运行正常,请使用我的测试项目尝试以下操作:

>heroku run bash
Running `bash` attached to terminal... up, run.1
~ $ phantomjs test.js http://bbcnews.com foo.png
~ $ ls *.png
foo.png

我无法在本地重现任何这些问题,但报告的其他问题可能会让人们在本地遇到此问题。

问题似乎源于shim.js第1637行:

s.on('request', function(req) {
  var evil;
  evil = "function(){socket.emit('message', " + (JSON.stringify(JSON.stringify(req))) + " + '\\n');}";
  return controlPage.evaluate(evil);
});

我尝试过各种版本的节点,幻像等,没有运气。

我也尝试过设置DYLD变量的自定义buildpack,看看http://github.com/tecnh/heroku-buildpack-nodejs没有运气。

任何让Phantom + Node在Heroku上很好地玩耍的人请告诉我。在Stackoverflow上有几个引用,但没有人说“我让它工作,这是如何”。

2 个答案:

答案 0 :(得分:2)

我从未使用过phantomjs节点模块,但我确实有一个应用程序在Heroku上运行node和phantomjs。

您需要使用自定义构建包才能使其正常工作。我的.buildpacks file看起来像

http://github.com/heroku/heroku-buildpack-nodejs.git
http://github.com/stomita/heroku-buildpack-phantomjs.git

然后,您应该能够在子进程中运行phantomjs脚本:

var script = app.get('root') + '/scripts/rasterize.js' //the phantomjs script to run
  , bin = app.get('phantom') //normally this would just be the string "phantomjs"
  , spawn = require('child_process').spawn;

// set up args to the phantom cli
// (run the phantomjs command in your terminal to see options/format)
var args = [];
// ...

var phntm = spawn(bin, args);

phntm.stdout.on('data', function (data) { /* do something */ });
phntm.stderr.on('data', function (data) { /* do something */ });
phntm.on('exit', function (code) { /* handle exit */ });

答案 1 :(得分:0)

Heroku不支持WebSockets。使用Socket.io,它有一个workaround。不确定dnode使用哪个phantomjs-node

我在Heroku上也遇到了WebSockets的问题,我切换到了Nodejitsu,这为我解决了这个问题。