variable node keywords javascript node.js global-variables

javascript - keywords - object node js



¿Compartir variables entre archivos en Node.js? (5)

Las variables globales casi nunca son algo bueno (tal vez una excepción o dos por ahí ...). En este caso, parece que realmente solo desea exportar su variable "nombre". P.ej,

// module.js var name = "foobar"; // export it exports.name = name;

Luego, en main.js ...

//main.js // get a reference to your required module var myModule = require(''./module''); // name is a member of myModule due to the export above var name = myModule.name;

Aquí hay 2 archivos:

// main.js require(''./modules''); console.log(name); // prints "foobar" // module.js name = "foobar";

Cuando no tengo "var", funciona. Pero cuando tengo:

// module.js var name = "foobar";

el nombre no estará definido en main.js.

He oído que las variables globales son malas y que es mejor utilizar "var" antes de las referencias. ¿Pero es este un caso donde las variables globales son buenas?


No puedo encontrar un escenario donde una var global sea la mejor opción, por supuesto puede tener una, pero eche un vistazo a estos ejemplos y puede encontrar una mejor manera de lograr lo mismo:

Escenario 1: poner las cosas en archivos de configuración

Necesita algún valor que sea el mismo en toda la aplicación, pero cambia según el entorno (producción, desarrollo o prueba), el tipo de correo como ejemplo, necesitaría:

// File: config/environments/production.json { "mailerType": "SMTP", "mailerConfig": { "service": "Gmail", .... }

y

// File: config/environments/test.json { "mailerType": "Stub", "mailerConfig": { "error": false } }

(hacer una configuración similar para dev también)

Para decidir qué configuración se cargará, cree un archivo de configuración principal (esto se usará en toda la aplicación)

// File: config/config.js var _ = require(''underscore''); module.exports = _.extend( require(__dirname + ''/../config/environments/'' + process.env.NODE_ENV + ''.json'') || {});

Y ahora puedes obtener los datos de esta manera:

// File: server.js ... var config = require(''./config/config''); ... mailer.setTransport(nodemailer.createTransport(config.mailerType, config.mailerConfig));

Escenario 2: usar un archivo de constantes

// File: constants.js module.exports = { appName: ''My neat app'', currentAPIVersion: 3 };

Y úsalo de esta manera

// File: config/routes.js var constants = require(''../constants''); module.exports = function(app, passport, auth) { var apiroot = ''/api/v'' + constants.currentAPIVersion; ... app.post(apiroot + ''/users'', users.create); ...

Escenario 3: Use una función auxiliar para obtener / establecer los datos

No es un gran admirador de este, pero al menos puede seguir el uso del ''nombre'' (citando el ejemplo del OP) y poner las validaciones en su lugar.

// File: helpers/nameHelper.js var _name = ''I shall not be null'' exports.getName = function() { return _name; }; exports.setName = function(name) { //validate the name... _name = name; };

Y úsala

// File: controllers/users.js var nameHelper = require(''../helpers/nameHelper.js''); exports.create = function(req, res, next) { var user = new User(); user.name = req.body.name || nameHelper.getName(); ...

Podría haber un caso de uso cuando no hay otra solución que tener una var global, pero generalmente puede compartir los datos en su aplicación usando uno de estos escenarios, si está comenzando a usar node.js (como lo estuve hace algún tiempo) trata de organizar la forma en que manejas los datos allí porque puede complicarse muy rápido.


Si necesitamos compartir varias variables, use el siguiente formato

//module.js let name=''foobar''; let city=''xyz''; let company=''companyName''; module.exports={ name, city, company }

Uso

// main.js require(''./modules''); console.log(name); // print ''foobar''


una variable declarada con o sin la palabra clave var se adjuntó al objeto global. Esta es la base para crear variables globales en el nodo al declarar variables sin la palabra clave var. Mientras que las variables declaradas con la palabra clave var permanecen locales a un módulo.

vea este artículo para una mayor comprensión - https://www.hacksparrow.com/global-variables-in-node-js.html


Actualizar

Guarde cualquier variable que desee compartir como un solo objeto. Luego, páselo al módulo cargado para que pueda acceder a la variable a través de la referencia del objeto.

// myModule.js var shared = null; function init(obj){ shared = obj; } module.exports = { init:init }

.

// main.js var myModule = require(''./myModule.js''); var shares = {value:123}; myModule.init(shares);

Vieja respuesta

Para compartir variables entre módulos, puede usar la función para obtener el valor de la variable entre el principal y los módulos.

//myModule.js var mainFunction = null; //You can also put function reference in a Object or Array function functionProxy(func){ mainFunction = func; //Save the function reference } // --- Usage --- // setTimeout(function(){ // console.log(mainFunction(''myString'')); // console.log(mainFunction(''myNumber'')); // }, 3000); module.exports = { functionProxy:functionProxy }

.

//main.js var myModule = require(''./myModule.js''); var myString = "heyy"; var myNumber = 12345; function internalVariable(select){ if(select==''myString'') return myString; else if(select==''myNumber'') return myNumber; else return null; } myModule.functionProxy(internalVariable); // --- If you like to be able to set the variable too --- // function internalVariable(select, set){ // if(select==''myString''){ // if(set!=undefined) myString = set; // else return myString; // } // else if(select==''myNumber''){ // if(set!=undefined) myNumber = set; // else return myNumber; // } // else return null; // }

Siempre puedes obtener el valor de main.js incluso el valor fue cambiado.