2012-09-04 52 views
13

Tôi đã thành công với Phantomjs để làm việc trên Heroku nhưng giờ tôi đang gặp sự cố với giao diện nút phantomjs cho node.js (xem https://github.com/sgentle/phantomjs-node).Gặp sự cố khi chạy nút Phantomjs + trên Heroku

Khi tôi đang cố gắng để khởi Phantom tôi nhìn thấy một sự chậm trễ 10-15 giây và sau đó:

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

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

Bạn có thể tạo lại vấn đề với các bước sau hoặc bằng cách kéo xuống ứng dụng thử nghiệm của tôi tại 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 

thử nghiệm ứng dụng của bạn đã đưa ra, thứ ba đến dòng cuối cùng sẽ cho bạn biết địa chỉ URL, nó nên đọc như:

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

Nếu thành công bạn sẽ thấy Hello World! trong trình duyệt của bạn.

Bây giờ từ thư mục tương tự như ứng dụng của bạn chạy Heroku:

heroku run node 

Tại dấu nhắc nút thử như sau:

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

Chờ 10-15 giây và bạn sẽ thấy lỗi. Không có gì hoạt động từ thời điểm này.

này nên đầu ra tập tin 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()}); }); }); }); 

Để xác nhận Phantomjs đang làm việc tốt trên Heroku, hãy thử những điều sau đây sử dụng dự án thử nghiệm của tôi:

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

tôi không thể tái tạo bất kỳ những vấn đề này tại địa phương nhưng có những vấn đề khác được báo cáo, nơi mọi người có thể đã gặp vấn đề này cục bộ.

Vấn đề dường như bắt nguồn từ shim.js dòng 1637:

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

Tôi đã thử các biến thể của phiên bản của nút, phantom vv không có may mắn.

Tôi cũng đã thử một tệp xây dựng tùy chỉnh đặt biến DYLD, xem http://github.com/tecnh/heroku-buildpack-nodejs mà không có may mắn.

Bất cứ ai đã có Phantom + Node chơi cùng nhau độc đáo trên Heroku, vui lòng cho tôi biết. Có một số tham chiếu đến điều này trên Stackoverflow nhưng không ai nói "Tôi đã nhận nó để làm việc, đây là cách".

+0

Bạn đã bao giờ tìm thấy câu trả lời cho điều này? Tôi cũng đang cố gắng để có được các ảo ảnh và nút nhạc chơi tốt trên heroku: http://goo.gl/oIhPU –

+0

bạn có biên dịch ảo cho Heroku không? –

+2

Heroku dường như đề xuất gói xây dựng này cho các ứng dụng phantom.js: https://github.com/stomita/heroku-buildpack-phantomjs - nó cũng được cập nhật gần đây hơn so với bạn tham khảo. Bạn đã thử chưa? – friism

Trả lời

0

Heroku không hỗ trợ WebSockets. Với Socket.io nó có một workaround. Không chắc chắn về dnode, trong đó sử dụng phantomjs-node.

Tôi cũng gặp sự cố với WebSockets trên Heroku và tôi đã chuyển sang Nodejitsu, giải quyết vấn đề này cho tôi.

2

Tôi chưa bao giờ sử dụng mô-đun nút ảo, nhưng tôi có một ứng dụng chạy cả nút và phantomj trên Heroku.

Bạn cần sử dụng buildpacks tùy chỉnh để làm việc này hoạt động..buildpacks file của tôi trông giống như

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

Sau đó bạn sẽ có thể chạy phantomjs script trong một quá trình con:

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 */ }); 
Các vấn đề liên quan