2012-06-11 25 views
34

Na przykład chcę użyć niestandardowego Rejestrator:Jak używać zmiennej globalnej w pliku node.js?

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

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

var log = new logger(customConfig) 

Sposób korzystania z tego rejestratora w innych modułach zamiast console.log?

+1

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

Odpowiedz

66

Większość ludzi odradza stosowanie zmiennych globalnych. Jeśli chcesz tę samą klasę rejestratora w różnych modułach można to zrobić

logger.js

module.exports = new logger(customConfig); 

foobar.js

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

Jeżeli chcesz zmienną globalną można zrobić:

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

NIE używaj zmiennych globalnych! Jeśli zaczniesz uruchamiać aplikację z wieloma procesami, dostaniesz bardzo źle przykręcone. – TheHippo

+0

Czy zapomniałeś "." W swojej globalnej definicji? 'global.logger = new logger (customConfig);'? – jagill

+14

TheHippo, zmienne globalne są w niektórych przypadkach dobre, nawet w przypadku wielu procesów. Rejestrator na przykład nie będzie miał problemów, jeśli kilka procesów ma swoje własne wystąpienie obiektu rejestrującego. – 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 różni się od JavaScript Side po stronie klienta, jeśli chodzi o zmienne globalne. Samo użycie słowa var u góry skryptu Node.js nie oznacza, że ​​zmienna będzie dostępna dla wszystkich wymaganych obiektów, takich jak "podstawowy rejestrator".

Aby zrobić coś globalnego, wystarczy umieścić słowo global i kropkę przed nazwą zmiennej. Więc jeśli chcę, aby identyfikator company_id był globalny, nazywam go global.company_id. Ale bądź ostrożny, global.company_id i company_id to to samo, więc nie nazwij zmiennej globalnej tym samym, co każda inna zmienna w jakimkolwiek innym skrypcie - innym skrypcie, który będzie działał na twoim serwerze lub jakimkolwiek innym miejscu w tym samym kodzie .

+0

Jest inaczej, ponieważ każdy plik/moduł jest niejawnie zawinięty w IIFE w czasie kompilacji, więc vary są w rzeczywistości lokalne dla IIFE. – superluminary

15

Proponuję za każdym razem przy użyciu globalnej sprawdzić, czy zmienna jest już określić po prostu sprawdzić

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

Znalazłem to mieć lepszą wydajność

+0

Co masz na myśli mówiąc "lepsza wydajność"? – wiktus239

+0

@ wiktus239 Jest to sprawdzanie, ponieważ nie wymaga ponownego załadowania modułu - lepsza wydajność. –

16

można zdefiniować go przy użyciu globalnej lub globalnych , nodejs obsługuje oba.

dla np

global.underscore = require("underscore"); 

lub

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

prosty, ostry i wyraźny. dzięki. :) – Haranadh

+1

Twoje powitanie :) –

2

Może być następujący lepiej unikać oświadczenie if:

global.logger || (global.logger = require('my_logger')); 
Powiązane problemy