Подтвердить что ты не робот

Проблемы с запуском Phantomjs + node на Heroku

Я успешно получил Phantomjs для работы на Heroku, но теперь я сталкиваюсь с проблемами с интерфейсом phantomjs- node для node.js(см. 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

В приглашении 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);
});

Я пробовал варианты версий node, phantom и т.д. без везения.

Я также пробовал настраиваемый buildpack, который устанавливает переменную DYLD, не смотря на http://github.com/tecnh/heroku-buildpack-nodejs.

Любой, у кого есть Phantom + node, играющий вместе на Heroku, пожалуйста, дайте мне знать. Есть несколько ссылок на это на Stackoverflow, но никто не говорит "Я получил его работать, вот как".

4b9b3361

Ответ 1

Я никогда не использовал модуль phantomjs node, но у меня есть приложение, работающее как с node, так и с phantomjs на Heroku.

Для того, чтобы это работало, вам нужно использовать пользовательские сборки. Мой .buildpacks файл выглядит как

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 */ });

Ответ 2

Heroku не поддерживает WebSockets. С Socket.io у него есть обходной путь. Не уверен в dnode, который использует phantomjs-node.

У меня была проблема с WebSockets на Heroku, и я переключился на Nodejitsu, который решил это для меня.