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

Posted

技术标签:

【中文标题】Node.js 和 JQuery:“ReferenceError:$ 未定义”错误。如何在服务器上将 jquery 与节点一起使用?【英文标题】:Node.js & JQuery: "ReferenceError: $ is not defined" error. How do I use jquery with node on the server? 【发布时间】:2016-07-30 07:05:33 【问题描述】:

帮助!我正在尝试在我的 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 $ = 部分之前执行吗?

谢谢!

版本:

节点:4.2.6 快递: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();
);

【问题讨论】:

【参考方案1】:

如果在 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();
);

【讨论】:

真可惜,我以为我可以把它放在上面而忘记它!这很好用,谢谢:)【参考方案2】:
//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();
);

【讨论】:

【参考方案3】:

如果您不需要可用的完整 DOM,而只想解析和抓取/操作 html 元素,那么 cheeriojsdom 更轻量级,并且仍然为您提供类似 jQuery 的 API。

【讨论】:

【参考方案4】:

您需要做的就是在 $ 初始化之后立即将调用 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 根本不知道$ 存在。所以我们需要在某个地方(例如全局)定义它来创建一个带有$ 变量的closure。

【讨论】:

以上是关于Node.js 和 JQuery:“ReferenceError:$ 未定义”错误。如何在服务器上将 jquery 与节点一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

node.js 和 jquery web 的 UI [关闭]

使用 node.js 和 express 的 JQuery Ajax 发布请求

带有 Node.js 和 jQuery 的 CORS

以 node.js 作为后端的 HTML 中的 jQuery

使用 Node.js 和 Socket.IO 单击时的 jQuery 函数

使用 Node.JS express 和 AJAX 进行 JQuery 自动完成