2012-04-13 15 views
7

Estoy intentando conseguir jsdom a trabajar :)Node.js jsdom

Aquí está el código:

var jsdom = require("jsdom"); 
var request = require("request"); 
var fs  = require('fs'); 
var jquery = fs.readFileSync("./jquery-1.7.2.js", 'utf-8'); 

request({ uri:'http://nodejs.org/dist/' }, function (error, response, body) { 
    if (error && response.statusCode !== 200) { 
     console.log('HTTP request error... '+error); 
    } 
    jsdom.env({ 
     html: body, 
     scripts: [ 
      jquery 
     ], 
     done: function(errors, window) { 
      console.log('done'); 
     } 
    }); 
}); 

Y aquí está el error:

jsdom.js:171 
    features = JSON.parse(JSON.stringify(window.document.implementation._fea 
                 ^
TypeError: Cannot read property 'implementation' of undefined 

He comprobado si el la página se busca y si se analiza el jquery lib, lo son.

Podríamos mirar a la implementación de jsdom.js:

[snip] 
exports.env = exports.jsdom.env = function() { 
    [snip] 
    window  = exports.html(html, null, options).createWindow(), 
    features = JSON.parse(JSON.stringify(window.document.implementation._features)), 
    docsLoaded = 0, 
    [snip] 

Parece que el .createWindow() no tiene éxito ...

y estoy ejecutarlo en Cloud9.

Cualquier ayuda es bienvenida.

+0

¿Qué versión de node y jsdom? Funciona aquí con el nodo v0.6.16 y jsdom 0.2.14. (Por cierto, podría hacer 'fs.readFileSync (ruta, 'utf8')' en lugar de la llamada 'toString()' (a la que probablemente también debería pasar ''utf8'')). –

+0

La versión del nodo es 0.6.8 y la versión de jsdom es 0.2.14. – kal3v

+0

si el código es del lado del servidor, creo que "ventana" es solo del lado del navegador – ZiTAL

Respuesta

7

Como se informó en https://github.com/tmpvar/jsdom/issues/436, esto puede deberse a que contextify no se instaló. En teoría, jsdom tiene un shim que le permite funcionar sin tener contextuales, razón por la cual lo tiene como un módulo opcional en lugar de obligatorio, pero este shim parece estar roto (ver https://github.com/tmpvar/jsdom/issues/456).

Por lo tanto, ahora mismo necesita tener contextify instalado para usar el último jsdom. Dependiendo de su sistema operativo y su entorno, existen varios motivos que podrían ser un problema. Ejecute npm install contextify y luego rastree ese problema.

Cosas para intentar dependiendo de cuál sea su problema de raíz: - Verifique que tiene instalado Python 2.7 o superior y que está instalado de manera óptima 2.7.3. También verifique el que se ejecuta cuando escribe python --version y que su PYTHONPATH es correcta. - sudo npm install contextify - npm cache clean; npm instalar contextify --force

+0

Gracias por el enlace a la discusión de problemas. Después de abordar este problema, estoy pensando en cambiar a Domino/Zepto Node, para evitar la dependencia de Python. – Jonathan

+0

Tuve el mismo problema. instalar contextify y actualizar jsdom sí lo hizo: 'sudo npm install contextify; npm ls; npm eliminar jsdom; npm install [email protected]; npm cache clean' –

0

Prueba a actualizar jsdom. Tenía exactamente el mismo error con una versión anterior de jsdom (0.3.x). Luego lo eliminé e instalé la versión actual ([email protected]) y ahora funciona.