2012-09-04 98 views
13

我已經成功將Phantomjs用於Heroku,但現在我遇到了node.js的phantomjs-node接口問題(請參閱https://github.com/sgentle/phantomjs-node)。在Heroku上運行Phantomjs +節點時遇到問題

當我試圖初始化幻影我看到一個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也沒有運氣。

任何人都有幻影+節點在Heroku上很好地一起玩,請讓我知道。在Stackoverflow上有幾處對此的引用,但沒有人說「我得到它的工作,這是如何」。

+0

你有沒有找到一個答案?我也試圖讓phantomjs和nodejs在heroku上玩得很好:http://goo.gl/oIhPU –

+0

你有爲Heroku編譯過的phantomjs嗎? –

+2

Heroku似乎推薦phantom.js應用程序的這個buildpack:https://github.com/stomita/heroku-buildpack-phantomjs - 它也比最近更新更多的參考。你試過了嗎? – friism

回答

0

Heroku不支持WebSockets。使用Socket.io它有一個workaround。不確定dnode,其中phantomjs-node使用。

我在Heroku上的WebSockets也出現了問題,我切換到Nodejitsu,它爲我解決了它。

2

我從來沒有使用phantomjs節點模塊,但我確實有一個應用程序在Heroku上運行節點和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 */ }); 
相關問題