繁体   English   中英

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

[英]Node.js & JQuery: “ReferenceError: $ is not defined” error. How do I use jquery with node on the server?

救命! 我正在尝试在我的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

您是否认为该functionvar $ = part 之前执行?

谢谢!

版本:

  • 节点:4.2.6
  • 快递:4.12.4
  • jQuery的:2.2.3
  • JSS:8.3.0

更新:解决方案

根据每个人的答案,这是我最终使用的内容!

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

如果jsdom.env函数的边界在外部,则声明doSomething函数。 $仅可在该回调内部访问。 这样的事情应该起作用:

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();
});
//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();
});

如果您不需要可用的完整DOM,而只是想解析和抓取/操作html元素,那么可以使用cheerio ,它比jsdom更轻巧,并且仍然为您提供类似于jQuery的API。

您需要做的就是在$初始化之后立即将调用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根本不知道$存在。 因此,我们需要在某个地方(例如全局)定义它,以使用$变量进行闭合

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM