variable node node.js express

node.js - node - Variable global en app.js accesible en las rutas?



node js global variable (11)

¿Cómo configuro una variable en app.js y la tengo disponible en todas las rutas, al menos en el archivo index.js ubicado en las rutas? utilizando el marco express y node.js


Aquí se explican bien, en resumen:

http://www.hacksparrow.com/global-variables-in-node-js.html

Así que estás trabajando con un conjunto de módulos de Nodo, tal vez un framework como Express.js, y de repente sientes la necesidad de hacer que algunas variables sean globales. ¿Cómo se hacen variables globales en Node.js?

El consejo más común para esto es "declarar la variable sin la palabra clave var" o "agregar la variable al objeto global" o "agregar la variable al objeto GLOBAL". ¿Cuál usas?

Primero, analicemos el objeto global. Abra un terminal, inicie un Nodo REPL (prompt).

> global.name undefined > global.name = ''El Capitan'' > global.name ''El Capitan'' > GLOBAL.name ''El Capitan'' > delete global.name true > GLOBAL.name undefined > name = ''El Capitan'' ''El Capitan'' > global.name ''El Capitan'' > GLOBAL.name ''El Capitan'' > var name = ''Sparrow'' undefined > global.name ''Sparrow''


Como otros ya han compartido, app.set(''config'', config) es ideal para esto. Solo quería agregar algo que no vi en las respuestas existentes que es bastante importante. Una instancia de Node.js se comparte en todas las solicitudes, por lo que si bien puede ser muy práctico compartir algún objeto de config o router global, el almacenamiento de datos de tiempo de ejecución de forma global estará disponible en todas las solicitudes y usuarios . Considera este ejemplo muy simple:

var express = require(''express''); var app = express(); app.get(''/foo'', function(req, res) { app.set(''message'', "Welcome to foo!"); res.send(app.get(''message'')); }); app.get(''/bar'', function(req, res) { app.set(''message'', "Welcome to bar!"); // some long running async function var foo = function() { res.send(app.get(''message'')); }; setTimeout(foo, 1000); }); app.listen(3000);

Si visita /bar y otra solicitud ingresa /foo , su mensaje será "¡Bienvenido a foo!". Este es un ejemplo tonto, pero hace entender el punto.

Hay algunos puntos interesantes sobre esto en ¿Por qué las diferentes sesiones de node.js comparten variables? .


En realidad, es muy fácil hacer esto usando los métodos "set" y "get" disponibles en un objeto express.

Ejemplo de la siguiente manera, supongamos que tiene una variable llamada config con sus elementos relacionados con la configuración que desea que esté disponible en otros lugares:

En app.js:

var config = require(''./config''); app.configure(function() { ... app.set(''config'', config); ... }

En routes / index.js

exports.index = function(req, res){ var config = req.app.get(''config''); // config is now available ... }


Esta fue una pregunta útil, pero podría ser más así al dar ejemplos de código reales. Incluso el artículo vinculado no muestra una implementación. Yo, por lo tanto, humildemente presento:

En su archivo app.js , la parte superior del archivo:

var express = require(''express'') , http = require(''http'') , path = require(''path''); app = express(); //IMPORTANT! define the global app variable prior to requiring routes! var routes = require(''./routes'');

app.js no tendrá ninguna referencia al método app.get() . Deje que estos se definan en los archivos de rutas individuales.

routes/index.js :

require(''./main''); require(''./users'');

y finalmente, un archivo de rutas reales, routes/main.js :

function index (request, response) { response.render(''index'', { title: ''Express'' }); } app.get(''/'',index); // <-- define the routes here now, thanks to the global app variable


La respuesta de John Gordon fue la primera de docenas de respuestas a medias explicadas / documentadas que probé, de muchos sitios, que realmente funcionaron. Gracias Sr. Gordon. Lo siento, no tengo los puntos para marcar tu respuesta.

Me gustaría agregar, para otros novatos a node-route-file-splitting, que el uso de la función anónima para ''index'' es lo que uno verá más a menudo, por lo que usar el ejemplo de John para el main.js, el funcionalmente- El código equivalente que normalmente encontraría es:

app.get(''/'',(req, res) { res.render(''index'', { title: ''Express'' }); });


Para declarar una variable global que necesita, use global objeto global . Me gusta global.yourVariableName. Pero no es una forma verdadera. Para compartir variables entre los módulos intenta usar el estilo de inyección como

someModule.js:

module.exports = function(injectedVariable) { return { somePublicMethod: function() { }, anotherPublicMethod: function() { }, }; };

app.js

var someModule = require(''./someModule'')(someSharedVariable);

O puede usar un objeto sustituto para hacer eso. Como hub .

someModule.js:

var hub = require(''hub''); module.somePublicMethod = function() { // We can use hub.db here }; module.anotherPublicMethod = function() { };

app.js

var hub = require(''hub''); hub.db = dbConnection; var someModule = require(''./someModule'');


Para hacer una variable global, simplemente declare sin la palabra clave var . (En términos generales, esta no es la mejor práctica, pero en algunos casos puede ser útil; solo tenga cuidado ya que hará que la variable esté disponible en todas partes).

Aquí hay un ejemplo de visionmedia/screenshot-app

archivo app.js :

/** * Module dependencies. */ var express = require(''express'') , stylus = require(''stylus'') , redis = require(''redis'') , http = require(''http''); app = express(); //... require() route files

rutas de archivos / main.js

//we can now access ''app'' without redeclaring it or passing it in... /* * GET home page. */ app.get(''/'', function(req, res, next){ res.render(''index''); }); //...


Resolví el mismo problema, pero tuve que escribir más código. server.js un archivo server.js , que usa Express para registrar rutas. Expone una función, register , que puede ser utilizada por otros módulos para registrar sus propias rutas. También expone una función, startServer , para comenzar a escuchar un puerto

server.js const express = require(''express''); const app = express(); const register = (path,method,callback) => methodCalled(path, method, callback) const methodCalled = (path, method, cb) => { switch (method) { case ''get'': app.get(path, (req, res) => cb(req, res)) break; ... ... default: console.log("there has been an error"); } } const startServer = (port) => app.listen(port, () => {console.log(`successfully started at ${port}`)}) module.exports = { register, startServer }

En otro módulo, use este archivo para crear una ruta.

help.js const app = require(''../server''); const registerHelp = () => { app.register(''/help'',''get'',(req, res) => { res.send("This is the help section") }), app.register(''/help'',''post'',(req, res) => { res.send("This is the help section") })} module.exports = { registerHelp }

En el archivo principal, arranque ambos.

app.js require(''./server'').startServer(7000) require(''./web/help'').registerHelp()


Una buena manera de hacer esto es usar app.locals proporcionados por Express. Here está la documentación.

// In app.js: app.locals.variable_you_need = 42; // In index.js exports.route = function(req, res){ var variable_i_needed = req.app.locals.variable_you_need; }


app.all

El método app.all () es útil para mapear lógica "global" para prefijos de ruta específicos o coincidencias arbitrarias.

En mi caso, estoy usando confit para la administración de configuración,

app.all(''*'', function (req, res, next) { confit(basedir).create(function (err, config) { if (err) { throw new Error(''Failed to load configuration '', err); } app.set(''config'', config); next(); }); });

En las rutas, simplemente debe req.app.get(''config'').get(''cookie'');


Mi forma preferida es usar dependencias circulares *, que nodo soporta

  • en app.js define var app = module.exports = express(); como su primer orden del día
  • Ahora cualquier módulo requerido después del hecho puede var app = require(''./app'') para acceder a él
app.js

var express = require(''express''); var app = module.exports = express(); //now app.js can be required to bring app into any file //some app/middleware, config, setup, etc, including app.use(app.router) require(''./routes''); //module.exports must be defined before this line routes / index.js

var app = require(''./app''); app.get(''/'', function(req, res, next) { res.render(''index''); }); //require in some other route files...each of which requires app independently require(''./user''); require(''./blog'');