2012-04-13 14 views
7

Próbuję dostać jsdom pracować :)node.js jsdom

Oto kod:

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'); 
     } 
    }); 
}); 

A oto błąd:

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

Sprawdziłem czy strona jest pobierana i jeśli lib biblioteki jquery jest analizowany - są.

Moglibyśmy patrzeć na realizację 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] 

Wydaje się, że .createWindow() nie powiedzie ...

I używam go na Cloud9.

Każda pomoc jest mile widziane.

+0

Jaka wersja węzła i jsdom? Działa tutaj z węzłem v0.6.16 i jsdom 0.2.14. (Nawiasem mówiąc, możesz zrobić 'fs.readFileSync (path, 'utf8')' zamiast wywołania 'toString()' (do którego również prawdopodobnie powinieneś przekazać ''utf8'')). –

+0

Wersja węzła to 0.6.8, a wersja jsdom to 0.2.14. – kal3v

+0

jeśli kod jest po stronie serwera, myślę, że "okno" jest tylko od strony przeglądarki – ZiTAL

Odpowiedz

7

Zgodnie z informacjami pod numerem https://github.com/tmpvar/jsdom/issues/436 przyczyną może być niewystarczająca instalacja kontekstify. Teoretycznie jsdom ma podkładkę, która pozwala mu pracować bez kontekstualizacji, dlatego ma go wymieniony jako opcjonalny, a nie wymagany moduł, ale to podpięcie wydaje się być uszkodzone (patrz https://github.com/tmpvar/jsdom/issues/456).

Tak więc od teraz musisz zainstalować kontekstify, aby używać najnowszego jsdom. W zależności od systemu operacyjnego i środowiska istnieje kilka przyczyn, które mogą stanowić problem. Uruchom npm install contextify, a następnie wyśledź ten problem.

Rzeczy, które należy wypróbować w zależności od problemu głównego: - Sprawdź, czy masz zainstalowany Python 2.7 lub nowszy i optymalnie 2.7.3. Zweryfikuj także ten, który zostanie uruchomiony po wpisaniu Pythona - wersja i że PYTHONPATH jest poprawna. - sudo npm install contextify - npm cache clean; npm install contextify --force

+0

Dzięki za link do dyskusji o problemach. Po uderzeniu w ten problem myślę o przejściu na Domino/Zepto Node, aby uniknąć zależności Pythona. – Jonathan

+0

Miałem ten sam problem. install contextify i upgrade jsdom zrobiły to: 'sudo npm install contextify; npm ls; npm usuń jsdom; npm install [email protected]; npm cache clean' –

0

Spróbuj zaktualizować jsdom. Miałem dokładnie ten sam błąd w starej wersji jsdom (0.3.x). Następnie usunąłem go i zainstalowałem aktualną wersję ([email protected]), a teraz działa.