2012-09-04 12 views
13

Logré que Phantomjs funcione correctamente en Heroku, pero ahora estoy solucionando problemas con la interfaz phantomjs-node para node.js (ver https://github.com/sgentle/phantomjs-node).Problemas para ejecutar el nodo Phantomjs + en Heroku

cuando estoy intentar inicializar fantasma que estoy viendo un segundo retardo 10-15 y luego:

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

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

Puede reproducir el problema con los siguientes pasos o tirando hacia abajo de mi aplicación de prueba en 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 

Prueba de su aplicación ha llegado, la tercera a la última línea le dirá la URL, se debe leer como:

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

¡Si tiene éxito, debería ver Hello World! en tu navegador.

Y desde la misma carpeta que la aplicación se ejecute Heroku:

heroku run node 

En el símbolo del nodo intente lo siguiente:

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

esperar 10-15 segundos y debería ver el error. Nada funciona a partir de este momento.

Esto debería archivo de salida 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()}); }); }); }); 

Para validar PhantomJS está trabajando muy bien en Heroku, intente lo siguiente usando mi proyecto de prueba:

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

no puede reproducir cualquiera de estos problemas a nivel local, pero hay otros problemas reportados donde las personas pueden haber tocado este problema localmente.

El problema parece originarse en línea 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); 
}); 

He intentado variaciones de versiones de nodo, fantasma, por ejemplo, pero sin suerte.

También probé un buildpack personalizado que establece la variable DYLD, ver http://github.com/tecnh/heroku-buildpack-nodejs sin tener suerte.

Cualquiera que tenga Phantom + Node jugando muy bien en Heroku, por favor avíseme. Hay varias referencias a esto en Stackoverflow pero nadie dice "Lo tengo para trabajar, así es como".

+0

¿Alguna vez encontrar una respuesta a esto? También estoy intentando hacer que phantomjs y nodejs jueguen bien en heroku: http://goo.gl/oIhPU –

+0

¿has compilado phantomjs para Heroku? –

+2

Heroku parece recomendar este paquete de construcción para las aplicaciones phantom.js: https://github.com/stomita/heroku-buildpack-phantomjs; también se actualizó más recientemente que la referencia de usted. ¿Lo has probado? – friism

Respuesta

0

Heroku no es compatible con WebSockets. Con Socket.io tiene un workaround. No estoy seguro acerca de dnode, que usa phantomjs-node.

Tuve un problema con WebSockets en Heroku también y cambié a Nodejitsu, lo que me solucionó.

2

Nunca he usado el módulo de nodo phantomjs, pero sí tengo una aplicación que ejecuta tanto nodo como phantomjs en Heroku.

Es necesario que use buildpacks personalizados para que esto funcione.Mi .buildpacks file parece

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

A continuación, debería ser capaz de ejecutar secuencias de comandos PhantomJS en un proceso hijo:

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