2012-11-14 3 views
5

Je suis en train d'obtenir des variables que je peux obtenir partout dans mon code j'ai trouvé une solution, mais ce n'est pas très propreexpress Variable globale node.js

//environment.js  
module.exports.appName = "appName"; 

et mes app.js

var express = require('express') 
, routes = require('./routes/main') 
, user = require('./routes/user') 
, http = require('http') 
, path = require('path'); 

var app = express(); 

environment = require('./environment'); 

app.configure(function(){ 
app.set('port', process.env.PORT || 3000); 
app.set('views', __dirname + '/views'); 
app.set('view engine', 'jade'); 
app.use(express.favicon()); 
app.use(express.logger('dev')); 
app.use(express.bodyParser()); 
app.use(express.methodOverride()); 
app.use(express.cookieParser('your secret here')); 
app.use(express.session()); 
app.use(app.router); 
app.use(require('stylus').middleware(__dirname + '/public')); 
app.use(express.static(path.join(__dirname, 'public'))); 
}); 

app.configure('development', function(){ 
    app.use(express.errorHandler()); 
}); 


app.get('/', routes.home); 
app.get('/users', user.list); 

http.createServer(app).listen(app.get('port'), function(){ 
    console.log("Express server listening on port " + app.get('port')); 
}); 

De cette façon, mon var fonctionne, je peux accéder environment.appName partout, mais Y aurait meilleure solution

Merci

+0

Les variables globales IMHO sont une mauvaise solution en général. Donc, il n'y a probablement pas de «solution propre» pour une mauvaise chose à faire. – dave

+1

Dans le cas de la connexion à la base de données (initialisée au démarrage et un seul objet pendant toute la durée de vie du serveur), il s'agit d'une bonne approche. –

+0

Content que tu aies posté ceci, merci ... m'a aidé un peu. Passer au nœud maintenant et essayer de comprendre les choses. Je ne sais toujours pas ce que fait le 'app.configure ('development', function() {});' même si je l'utilise. Est-ce que cela place l'environnement dans le «développement» et ensuite commentez-le lorsque vous passez à la production? – BRogers

Répondre

8

Il existe une portée globale dans node.js.

Dans le fichier principal (celui que vous mettez derrière node dans la ligne de commande,) toutes les variables définies sont dans la portée globale.

var x = 100; 
// which global.x === 100 

Et dans d'autres fichiers chargés en tant que module, le champ d'application n'est pas global mais un objet sandbox local, vous avez donc besoin global.x d'accéder au même x dans le fichier principal.

Cela semble mieux que d'utiliser un require().

+0

Oui, ça marche bien, merci :) – Ajouve

+4

Je crois que vous devez omettre le 'var' pour qu'il soit sous l'objet' global' sinon c'est une variable de la portée du module. Alternativement, vous pouvez toujours être explicite en disant 'global.x = 100;' –

+0

@ThalisKalfigkopoulos Merci d'avoir signalé cela. J'ai supposé que tout le monde lisait cela pourrait déduire cela du contexte. – xiaoyi