2012-04-13 93 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])版本,现在它可以工作。