【发布时间】:2012-08-11 05:46:43
【问题描述】:
我在 Express 上玩了一会儿,我想知道,“最正确”的方法是处理链接到同一服务器的多个域。
假设我们有
- foo.com
- bar.net
- baz.com
它们都指向111.222.333.444。那台机器正在运行带有 Express 的 NodeJS。我目前的解决方案如下所示:
var express = require( 'express' ),
app = module.exports = express.createServer(),
// ... more lines ...
app.get( '/', routes.index.bind( app ) );
到目前为止,这非常简单。到目前为止,唯一的例外是在我的app.configure 通话中,我没有拨打.use( express.static() ) 的电话。那是因为 .routes.index() 方法现在看起来像这样:
var fs = require( 'fs' ),
// ... more lines ...
exports.index = function( req, res ) {
var host = /(\w+\.)?(.*)\.\w+/.exec( req.header( 'host' ) ),
app = this;
switch( host[ 2 ] ) {
case 'foo':
app.use( express.static( '/var/www/foo' ) );
fs.readFile( '/var/www/foo/index.html', 'utf8', fileReadFoo );
break;
case 'bar':
app.use( express.static( '/var/www/bar' ) );
fs.readFile( '/var/www/bar/index.html', 'utf8', fileReadBar );
break;
case 'baz':
// ... lines ...
res.render( 'index', { title: 'Baz Title example' } );
break;
default:
res.send('Sorry, I do not know how to handle that domain.');
}
function fileReadFoo( err, text ) {
res.send( text );
}
function fileReadBar( err, text ) {
res.send( text );
}
};
这里发生的是,我分析 req.header 的 host 条目并解析域名。基于此,我调用 .static() 方法,以便 Express 可以提供正确的静态资源等,此外,我只是简单地读取并发送 index.html的内容> 文件。我也尝试使用 Jade 来提供纯 HTML 文件,但 Jade 中的 include 指令只接受相对路径。
但是,这确实有效,但我不确定这是否是一个好习惯。
欢迎任何建议/帮助。
更新
我想我需要更清楚地说明这一点。无论如何,我都不是初学者。我非常了解 ES 和 NGINX 等其他服务器的工作原理。我正在寻找关于 NodeJS/Express 的正确之处的合格答案。如果为此使用 Node/Express 没有任何意义,请详细说明。如果使用 Node/Express 有更好的方法,请解释一下。
谢谢:-)
【问题讨论】:
-
+1,有趣的思维方式。
-
为什么它们必须全部托管在同一个进程中?在 node.js 中这样做是不自然的。如果“baz”网站崩溃,您将关闭静态网站。
-
它仍然是原创的,可能对特定用例有用。例如协调几个机器人。在同一个进程中多次运行同一个应用程序。可能很有趣。
-
由于浏览器缓存,这不是一个很好的解决方案。如果您有两个同名文件 - 例如styles.css - 那么当你访问 bar 时 foo css 可能会从缓存中加载。我试过这将是一个 SPA 应用程序,这个问题也会影响你的 app.min.js。
标签: javascript node.js express