2012-04-13 99 views
7

我試圖讓jsdom工作:)Node.js的jsdom錯誤

下面的代碼:

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

而這裏的錯誤:

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

我已如果檢查到頁面被抓取,如果jQuery的lib被解析 - 他們是。

我們可以看看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] 

看來,.createWindow()不成功......

而且我上運行它Cloud9

任何幫助,歡迎。

+0

什麼版本的節點和jsdom?它適用於節點v0.6.16和jsdom 0.2.14。 (順便說一下,你可以使用'fs.readFileSync(path,'utf8')'而不是'toString()'調用(你可能也應該通過''utf8''))。 – 2012-04-13 16:36:38

+0

節點的版本是0.6.8,jsdom的版本是0.2.14。 – kal3v 2012-04-15 09:55:04

+0

如果代碼是從服務器端我認爲「窗口」只是從瀏覽器端 – ZiTAL 2012-04-16 07:21:28

回答

7

截至https://github.com/tmpvar/jsdom/issues/436報道,這個可以通過contextify未安裝引起的。從理論上講,jsdom有一個墊片,它可以在沒有任何爭議的情況下工作,這就是爲什麼它將它列爲可選模塊而不是必需模塊,但是這個墊片似乎被破壞了(見https://github.com/tmpvar/jsdom/issues/456)。

所以截至目前你需要得到contextify安裝使用最新jsdom。根據您的操作系統和環境,有幾個原因可能是一個問題。運行npm install contextify然後追蹤該問題。

事情取決於你的根是什麼問題嘗試: - 確保你使用的Python 2.7或更高,最優2.7.3安裝。同時驗證它是在你輸入python --version並且你的PYTHONPATH是正確的時候運行的。 - sudo npm install contextify - npm cache clean; NPM安裝contextify --force

+0

謝謝你討論問題的鏈接。點擊這個問題後,我正在考慮切換到Domino/Zepto節點,以避免Python依賴。 – Jonathan 2012-11-15 06:23:51

+0

我有同樣的問題。安裝contextify並升級jsdom做到了這一點:'sudo npm install contextify; npm ls; npm刪除jsdom; npm install [email protected]; npm緩存清理「 – 2013-11-09 21:56:33

0

嘗試升級jsdom。我和老版本的jsdom(0.3.x)有完全一樣的錯誤。然後我刪除它並安裝了當前([email protected])版本,現在它可以工作。