2013-10-22 91 views
2

所以我知道這個工程:如何在沒有硬編碼的情況下在Expressjs中設置vhost?

app.use(express.vhost('sub.xyz.com', subdomainApp)); 
app.use(express.vhost('xyz.com', mainApp)); 

但是當我嘗試設置express.vhost主機部分動態,它根本不起作用。 (我需要,以避免改變硬編碼的域名,而我的生產和開發之間移動動態設置。)

我嘗試下面的代碼,我不知道爲什麼這不起作用:

app.use(function(req, res){ return express.vhost('xyz.'+req.host, subdomainApp); }); 
app.use(function(req, res){ return express.vhost(req.host, mainApp); }); 

那麼我如何將'請求主機'動態地傳遞給express.vhost呢?

+0

很可能,傳遞給'app.use'的函數與express.vhost('sub.xyz.com',subdomainApp)將返回的函數並不等效。例如,你的沒有'next',所以請求可能會掛起 – Plato

回答

2

我並不確切知道你的實現細節,但我認爲這是最常見的做法,就是在環境變量中設置這些配置參數。

所以你會有。
app.use(express.vhost('xyz' + process.env.APP_HOST, subdomainApp));

因此,您可以在生產/開發環境中使用不同的環境變量。

從命令行設置的env變量使用

export APP_HOST=wahtever 

或追加之前執行節點命令

APP_HOST=whatever node server.js 

或將它們添加到您的* *的.bash_profile或等同於您的操作系統

2

我誤解了你的問題,所以我的答案是關於編程綁定虛擬主機。我不知道你是否可以在請求進入時隨時綁定新的虛擬主機,這聽起來似乎是個壞主意。我只是使用@alfonsodev的技術來強制一個環境或另一個環境。

,如果你有一組已知的子域和特定的中間件的要執行這些域,你可以將它們綁定所有這樣的:

$ # set env variable before invoking the script 
$ APP_DEVPROD=dev node server.js 

// Default to 'prod' if no env var set 
var p = process.env.APP_DEVPROD || 'prod'; 
var myHost = (p === 'dev' ? 'localhost:8001' : 'xyz.com'); 

[ 
    ['admin.'+myHost, handlers.admin], 
    ['demo.'+myHost, handlers.demo], 
].forEach(setVhost); 

function setVhost(pair){ 
    var hostname = pair[0]; 
    var appFn = pair[1]; 
    app.use(express.vhost(hostname, appFn)); 
} 
0

使用*作爲主機通配符:

app.use(express.vhost('sub.*', subdomainApp)); 
app.use(mainApp); 

請參閱http://www.senchalabs.org/connect/vhost.html

+0

感謝您的答案。我使用@ alfonsodev的方法。儘管上述所有方法都很好。 –

+0

但我仍然不清楚我做錯了什麼? @plato我也試過使用next()。 –

相關問題