簡體   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