2012-06-11 19 views
34

Por ejemplo Quiero usar registrador de encargo:Cómo usar la variable global en node.js?

logger = require('basic-logger'), 
logger.setLevel('info') 

var customConfig = { 
showMillis: true, 
showTimestamp: true 
} 

var log = new logger(customConfig) 

Cómo utilizar este registrador en otros módulos en lugar de console.log?

+1

ver este post http://stackoverflow.com/questions/4140661/global-variables-for-node-js-standard-modules – xvatar

Respuesta

66

La mayoría de las personas desaconsejan el uso de variables globales. Si desea que la misma clase de logger en diferentes módulos se puede hacer esto

logger.js

module.exports = new logger(customConfig); 

foobar.js

var logger = require('./logger'); 
    logger('barfoo'); 

Si desea una variable global que puede hacer:

global.logger = new logger(customConfig); 
+20

NO use variables globales! Si comienzas a ejecutar tu aplicación con múltiples procesos, te atornillarán muy mal. – TheHippo

+0

¿Olvidó un '.' en su definición global? 'global.logger = new logger (customConfig);'? – jagill

+14

TheHippo, las variables globales son buenas en algunos casos, incluso con procesos múltiples. Un registrador, por ejemplo, no tendrá problemas si varios procesos tienen su propia instancia del objeto logger. – d512

27
global.myNumber; //Delclaration of the global variable - undefined 
global.myNumber = 5; //Global variable initialized to value 5. 
var myNumberSquared = global.myNumber * global.myNumber; //Using the global variable. 

Node.js es diferente del lado del cliente JavaScript cuando se trata de variables globales. Solo porque uses la palabra var en la parte superior de tu script Node.js no significa que todos los objetos que necesites puedan acceder a la variable, como tu 'basic-logger'.

Para hacer algo global simplemente coloque la palabra global y un punto delante del nombre de la variable. Entonces, si quiero que company_id sea global, lo llamo global.empresa_id. Pero tenga cuidado, global.company_id y company_id son lo mismo, así que no nombre la variable global de la misma manera que cualquier otra variable en cualquier otra secuencia de comandos: cualquier otra secuencia de comandos que se ejecutará en su servidor o en cualquier otro lugar dentro del mismo código .

+0

Es diferente porque cada archivo/módulo está envuelto implícitamente en un IIFE en tiempo de compilación, por lo que los vars son en realidad locales para el IIFE. – superluminary

15

Yo sugeriría cada cheque al utilizar la variable global si ya se define simplemente comprobar

if (!global.logger){ 
    global.logger = require('my_logger'); 
} 

He encontrado que tenga un mejor rendimiento

+0

¿Qué quiere decir con 'mejor desempeño'? – wiktus239

+0

@ wiktus239 Se trata de un control, ya que no requiere que el módulo se cargue nuevamente. De este modo, mejor rendimiento. –

16

se puede definir con el uso mundial o global , nodejs admite ambos.

por ejemplo

global.underscore = require("underscore"); 

o

GLOBAL.underscore = require("underscore"); 
+1

simple, nítido y claro. Gracias. :) – Haranadh

+1

su bienvenida :) –

2

puede estar siguiendo es mejor evitar el if declaración:

global.logger || (global.logger = require('my_logger')); 
Cuestiones relacionadas