2013-10-22 54 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()。 –

相关问题