Node.js和jQuery:“ReferenceError:$未定义”错误。如何在服务器上使用jQuery?

4

帮帮我!我正在尝试在我的Node.js应用程序中使用jQuery,但是当我尝试使用'$'时,会出现错误,显示"$未定义"......但我已经在顶部定义了它!这是我所做的:

我像下面这样从npm安装了两个包:

npm install jquery
npm install jsdom

然后我在我的Node.js应用程序中需要它们:
require("jsdom").env("", function(err, window) {
    if (err) {
        console.error(err);
        return;
    }
    var $ = require("jquery")(window);
});
doSomething();

然后我尝试像这样使用它:

function doSomething(){
    var deferred = $.Deferred();
}

我遇到了以下错误:

var deferred = $.Deferred();
               ^
ReferenceError: $ is not defined

你认为function是在var $ =之前执行吗?谢谢! 版本:Node:4.2.6 Express:4.12.4 JQuery:2.2.3 JSDom:8.3.0 更新:解决方案,这是我最终采用的方案,基于大家的回答!
var $;
require("jsdom").env("", function(err, window) {
    if (err) {
        console.error(err);
        return;
    }
    $ = require("jquery")(window);
    doSomething();
});
4个回答

3

您的doSomething函数声明在jsdom.env函数的范围之外。$仅在该回调函数内部可访问。像这样的代码应该可以解决问题:

var $;

require("jsdom").env("", function(err, window) {
    if (err) {
        console.error(err);
        return;
    }
    $ = require("jquery")(window);
    doSomething();
});

 function doSomething(){
    var deferred = $.Deferred();
}

尽管我认为在回调函数内部声明doSomething会更符合惯用法。这样它就可以从外部作用域访问jquery。
require("jsdom").env("", function(err, window) {
    if (err) {
        console.error(err);
        return;
    }

    function doSomething(){
        var deferred = $.Deferred();
     }
    var $ = require("jquery")(window);
    doSomething();
});

真遗憾,我以为我可以把它放在顶部然后忘记它!这很好用,谢谢 :) - Katie

1
//make sure $ is available in the global scope
var $;

function doSomething(){
    var deferred = $.Deferred();
}

require("jsdom").env("", function(err, window) {
    if (err) {
        console.error(err);
        return;
    }
    // assign it
    $ = require("jquery")(window);

    // you have to call it in here because you are in a callback 
    doSomething();
});

1
你只需要将调用doSomething()的操作放在回调函数中,在$初始化之后即可。
// define global variable for further usage
var $;

require("jsdom").env("", function(err, window) {
    if (err) {
        console.error(err);
        return;
    }

    // initialize global variable
    $ = require("jquery")(window);

    // will work properly here
    doSomething();
});

function doSomething() {
    // using already initialized global variable
    var deferred = $.Deferred();
}

在您的示例中,有两件事情需要注意:
1. 异步函数
我们需要确保只有在$初始化后才会调用doSomething
2. 变量作用域
非常重要的是在何处声明doSomething函数,在您的示例中doSomething根本不知道$的存在。因此,我们需要在某个地方定义它(例如全局),以便与$变量形成闭包

1
如果您不需要完整的DOM,并且只想解析和抓取/操作HTML元素,则可以使用比jsdom更轻量级的cheerio,它仍然提供类似于jQuery的API。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接