Node.js & amp; JQuery: & ldquo; ReferenceError: $ is not defined & rdquo; Error. How can I use jquery with a node on the server?

advertisements

Help! I'm trying to use jquery in my node.js app, but I keep getting an error when I try to use '$', saying "$ is not defined"... but I defined it at the top! Here's what I did:

I installed both packages from npm like so:

npm install jquery
npm install jsdom

then I required them in my node.js app:

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

Then I'm trying to use it like so:

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

and I get the following error:

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

Do you think that the function is getting executed before the var $ = part?

Thanks!

Versions:

  • Node: 4.2.6
  • Express: 4.12.4
  • JQuery: 2.2.3
  • JSDom: 8.3.0

Update: Solution

Here's what I ended up using, based on everyone's answers!

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


Your doSomething function is declared outside if the bounds of the jsdom.env function. $ is only accessible inside that callback. Something like this should work:

var $;

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

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

Though I think it would be more idiomatic to just declare doSomething inside the callback. That way it would have access to jquery from the outer scope.

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

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