30

什麼是最簡單的方法讓表達知道我在什麼環境?例如。我想根據我所處的環境來執行以下操作來連接到redis。可以通過命令行完成嗎?Node.js,express,並使用開發與生產app.configure

app.configure('development', function(){ 
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
    var r = require("redis").createClient(6379,'127.0.0.1'); 
}); 
app.configure('production', function(){ 
    app.use(express.errorHandler()); 
    r = redis.createClient(6379,'46.137.195.230', { detect_buffers: true }); 
}); 

回答

26

你的做法是好的,但你可以讓更多的東西通用的,比如存儲爲Redis的的配置數據在文件或通過類似參數的主機和端口:

node app.js REDIS_HOST REDIS_PORT

然後在你的應用程序,你可以使用process.argv抓住他們:

app.configure('development', function(){ 
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
    var r = require("redis").createClient(process.argv[2], process.argv[3]); 
}); 
app.configure('production', function(){ 
    app.use(express.errorHandler()); 
    var r = require("redis").createClient(process.argv[2], process.argv[3], { detect_buffers: true }); 
}); 

更新:

Express將知道你通過看NODE_ENV變量(process.env.NODE_ENV)是在什麼樣的環境:NODE_ENV=production node app.js(推薦),設置過程:https://github.com/visionmedia/express/blob/master/lib/application.js#L55

開始,像這樣的應用程序時,您可以設置變量.env.NODE_ENV在Express代碼之前手動添加到節點應用程序中,或者將該env var放入〜/ .profile中,如Ricardo所說。

+0

您可以進一步在package.json文件或其他配置文件中定義這些參數的默認值。 –

17

NODE_ENV環境變量正好被設置爲productiondevelopment,如在快遞文檔:http://expressjs.com/guide.html#configuration

我剛剛離開NODE_ENV=development在開發機的~/.profile(.bashrc或者在Linux上的.bash_profile),並做同樣的production個。

+6

只是擡起頭來。您發佈的鏈接現在已損壞。我相信eqivelant是http://expressjs.com/api.html#app。設置 – ChristopherStrydom

+0

或者可能:http://expressjs.com/en/advanced/best-practice-performance.html#set-node_env-to-production – tgf

9

我做了財產以後更全面的通過訂購這些參數的來源:

var env = process.argv[2] || process.env.NODE_ENV || 'development' 
    var mongourl = process.argv[3] || process.env.NODE_DB || 'mongodb://localhost/default' 
    var port = process.env.PORT || 9001 

這樣,您就可以使用命令行參數,ENV設置和默認值。

+1

使用上述技巧,除非手動執行'process.env.NODE_ENV = process .argv [2]'當在命令行上傳遞一個env參數時,Express仍會認爲你處於process.env.NODE_ENV模式(默認爲dev)。 – alessioalex

+0

是的。我可能不得不改變這一點。感謝您的觀察。 –

+1

用'var env = process.env.NODE_ENV ='代替'var env ='爲我工作。 –

24

爲了擴大使用config.json文件的想法:

// config.json 
{ 
    "development": { 
    "redisPort": 6379, 
    "redisHost": "127.0.0.1", 
    "errorHandlerOptions": {"dumpExceptions": true, "showStack": true} 
    }, 
    "production": { 
    "redisPort": 6379, 
    "redisHost": "46.137.195.230", 
    "errorHandlerOptions": {"dumpExceptions": false, "showStack": false} 
    } 
} 

加載配置文件和交換機基於ENV。

// app.js 
var config = require('./config.json')[app.get('env')]; 
app.use(express.errorHandler(config.errorHandlerOptions)); 
var r = require("redis").createClient(config.redisPort,config.redisHost); 

確保NODE_ENV設置每個服務器(見其他答案,一個辦法:NODE_ENV=production node app.js)上,並且這樣的配置變量有適當的其上運行的服務器的設置。