我希望能够在同一域下托管多个NodeJS应用程序,而无需使用子域(例如google.com/reader而不是images.google.com)。问题是我总是在Express / NodeJS中键入URL的第一部分,例如“ / reader”。
如何设置Express应用程序,使基本URL为something.com/myapp?
something.com/myapp
所以代替:
app.get("/myapp", function (req, res) { // can be accessed from something.com/myapp });
我可以:
// Some set-up app.base = "/myapp" app.get("/", function (req, res) { // can still be accessed from something.com/myapp });
我还想将Connect的staticProvider配置为以相同的方式运行(目前,默认情况下,它向something.com/js或something.com/css代替向something.com/myapp/js)提供静态文件
something.com/js
something.com/css
something.com/myapp/js
目前尚不支持此功能,要自己添加它并不容易。
整个路由选择的东西都埋在服务器代码的深处,此外,他们自己的路由也没有暴露。
我仔细研究了源代码,还检查了Express和Connect中间件的最新版本,但是仍然不支持此类功能,您应该在Connect或Express本身上打开一个问题。
与此同时…
自己修补事物,这是一种快速简便的方法,只需更改一行代码即可。
在中~/.local/lib/node/.npm/express/1.0.0/package/lib/express/servers.js,搜索:
~/.local/lib/node/.npm/express/1.0.0/package/lib/express/servers.js
// Generate the route this.routes[method](path, fn);
这应该在line周围357,替换为:
357
// Generate the route this.routes[method](((self.settings.base || '') + path), fn);
现在只需添加设置:
app.set('base', '/myapp');
这对于纯字符串路径可以很好地工作,为了获得RegEx支持,您将不得不自己在路由器中间件中乱砍,在这种情况下最好提出问题。
就静态提供程序而言,只需在/mypapp设置它时添加即可。
/mypapp
更新资料
也使其与RegExp一起工作:
// replace this.routes[method](baseRoute(self.settings.base || '', path), fn); // helper function baseRoute(base, path) { if (path instanceof RegExp) { var exp = RegExp(path).toString().slice(1, -1); return new RegExp(exp[0] === '^' ? '^' + base + exp.substring(1) : base + exp); } else { return (base || '') + path; } }
我仅使用少数几个表达式对此进行了测试,因此并未进行100%的测试,但从理论上讲应该可以。
更新2
对该修补程序提出了问题:https : //github.com/visionmedia/express/issues/issue/478