我尝试在其中运行带有jquery的文件时出现nodejs错误

时间:2013-12-31 00:42:38

标签: node.js

当我跑的时候 node script.js page.html我有这个错误,我不知道为什么,我确实把jquery放在我的依赖项中并且安装了它

  

C:\用户\ NEBELYN \桌面\ projects1 \段落\ node_modules \ jquery的\ DIST \的jquery.js:29

     

抛出新的错误(" jQuery需要一个带有文档的窗口");
                                                ^错误:jQuery需要一个带文档的窗口

at module.exports (C:\Users\NEBELYN\Desktop\projects1\paragraph\node_modules\jquery\dist\jquery.js:29:1
at Object.<anonymous> (C:\Users\NEBELYN\Desktop\projects1\paragraph\script.js:9:1)          

at Module._compile (module.js:456:26)                                                                  
at Object.Module._extensions..js (module.js:474:10)                                                    
at Module.load (module.js:356:32)                                                                      
at Function.Module._load (module.js:312:12)                                                            
at Function.Module.runMain (module.js:497:10)                                                          
at startup (node.js:119:16)                                                                            
at node.js:902:3

这是正在运行的代码

var argv = require('optimist').argv,
    $ = require('jquery'),
    fs = require('fs');

var file = argv._[0];

var html = fs.readFileSync(file, 'UTF-8');

$(html).find('p').each(function(index) {
    var content = $(this).html();

    console.log('Paragraph ' + (index + 1) + ': ' + content);
});

,这是page.html

<html>
<body>
    <p>Apple</p>
    <span>Unrelated</span>
    <p>Orange</p>

    <div>
        Steak
    </div>

    <p>Banana</p>
</body>
</html>

2 个答案:

答案 0 :(得分:2)

jQuery需要一个完整的DOM实现,而服务器上没有这个实现。

要解析HTML文本,您应该使用一个名为Cheerio的更简单的库,它具有类似jQuery的API,但不使用DOM。

或者,您可以使用JSDOM伪造服务器上的浏览器DOM(这样会更慢)。

答案 1 :(得分:2)

我的代码在一个月前运行良好,但是当我通过npm升级到最新的jquery时开始显示此错误。如果我只知道如何找回旧版本,那么问题就会消失。

这似乎解决了这个问题:

npm install jquery
npm install jsdom



// Define window
var jsdom = require("jsdom");
var window = jsdom.jsdom().createWindow();
var $ = require("jquery")( window );