Node.js & JQuery: error “ReferenceError: $ no está definido”. ¿Cómo uso jquery con nodo en el servidor?

¡Ayuda! Estoy tratando de usar jquery en mi aplicación node.js, pero recibo un error cuando bash usar ‘$’, diciendo “$ no está definido” … ¡pero lo definí en la parte superior! Esto es lo que hice:

Instalé ambos paquetes desde npm así:

npm install jquery npm install jsdom 

Luego los solicité en mi aplicación node.js:

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

Entonces estoy tratando de usarlo así:

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

y me sale el siguiente error:

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

¿Crees que la function se está ejecutando antes de la parte var $ = ?

¡Gracias!

Versiones:

  • Nodo: 4.2.6
  • Expreso: 4.12.4
  • JQuery: 2.2.3
  • JSDom: 8.3.0

Actualización: Solución

¡Esto es lo que terminé usando, basado en las respuestas de todos!

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

Su función doSomething se declara fuera de los límites de la función jsdom.env. $ solo es accesible dentro de esa callback. Algo como esto debería funcionar:

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

Aunque creo que sería más idiomático simplemente declarar algo dentro de la callback. De esa manera tendría acceso a jquery desde el ámbito externo.

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

Todo lo que necesita hacer es mover la llamada doSomething() dentro de su función de callback inmediatamente después $ inicialización de $ .

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

En tu ejemplo hay 2 cosas que debes tener en cuenta:

1. Funciones asíncronas.

Necesitamos garantizar que doSomething será llamado solo después de $ inicialización.

2. scopes variables

Realmente tiene sentido cuál es el lugar donde declaró doSomething function y en su ejemplo doSomething no sabe $ existe en absoluto. Así que necesitamos definirlo en algún lugar (por ejemplo, globalmente) para hacer un cierre con $ variable.

Si no necesita un DOM completo disponible y solo desea analizar y raspar / manipular elementos html, hay un cheerio que es más liviano que jsdom y aún le ofrece una API similar a jQuery.