2012-06-11 15 views
34

Per esempio voglio usare logger personalizzato:Come utilizzare la variabile globale in node.js?

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

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

var log = new logger(customConfig) 

Come usare questo logger in altri moduli, invece di console.log?

+1

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

risposta

66

La maggior parte delle persone sconsiglia di utilizzare variabili globali. Se si desidera che la stessa classe logger in diversi moduli si può fare questo

logger.js

module.exports = new logger(customConfig); 

foobar.js

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

Se si desidera una variabile globale che si possono fare:

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

NON utilizzare variabili globali! Se inizi a eseguire l'applicazione con più processi, ti farai sfondare molto male. – TheHippo

+0

Hai dimenticato un '.' nella tua definizione globale? 'global.logger = nuovo logger (customConfig);'? – jagill

+14

TheHippo, le variabili globali vanno bene in alcuni casi, anche con più processi. Ad esempio, un logger non presenterà problemi se diversi processi hanno una propria istanza dell'oggetto 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 è diverso dal lato client JavaScript quando si tratta di variabili globali. Solo perché si utilizza la parola var nella parte superiore dello script Node.js, non significa che la variabile sarà accessibile da tutti gli oggetti richiesti come il 'logger di base'.

Per rendere globale qualcosa basta mettere la parola globale e un punto davanti al nome della variabile. Quindi, se voglio che company_id sia globale, lo chiamo global.company_id. Ma fai attenzione, global.company_id e company_id sono la stessa cosa quindi non nominare la variabile globale la stessa cosa di qualsiasi altra variabile in nessun altro script - qualsiasi altro script che verrà eseguito sul tuo server o in qualsiasi altro posto all'interno dello stesso codice .

+0

È diverso perché ogni file/modulo è implicitamente avvolto in un IIFE in fase di compilazione, quindi i vars sono in realtà locali all'IFE. – superluminary

15

vorrei suggerire ogni volta quando si utilizza controllo globale, se la variabile è già definire semplicemente controllare

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

ho trovato ad avere prestazioni migliori

+0

Cosa intendi per "performance migliore"? – wiktus239

+0

@ wiktus239 È un controllo in quanto non richiede il caricamento del modulo di nuovo, quindi prestazioni migliori. –

16

si può definirlo con l'utilizzo globale o GLOBALE , nodejs supporta entrambi.

per esempio

global.underscore = require("underscore"); 

o

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

semplice, nitido e chiaro. Grazie. :) – Haranadh

+1

il benvenuto :) –

2

Può essere che segue è meglio evitare il if dichiarazione:

global.logger || (global.logger = require('my_logger')); 
Problemi correlati