一尘不染

是否可以为NodeJS应用设置基本URL?

node.js

我希望能够在同一域下托管多个NodeJS应用程序,而无需使用子域(例如google.com/reader而不是images.google.com)。问题是我总是在Express
/ NodeJS中键入URL的第一部分,例如“ / reader”。

如何设置Express应用程序,使基本URL为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/jssomething.com/css代替向something.com/myapp/js)提供静态文件


阅读 257

收藏
2020-07-07

共1个答案

一尘不染

目前尚不支持此功能,要自己添加它并不容易。

整个路由选择的东西都​​埋在服务器代码的深处,此外,他们自己的路由也没有暴露。

我仔细研究了源代码,还检查了Express和Connect中间件的最新版本,但是仍然不支持此类功能,您应该在ConnectExpress本身上打开一个问题。

与此同时…

自己修补事物,这是一种快速简便的方法,只需更改一行代码即可。

在中~/.local/lib/node/.npm/express/1.0.0/package/lib/express/servers.js,搜索:

// Generate the route
this.routes[method](path, fn);

这应该在line周围357,替换为:

// Generate the route
this.routes[method](((self.settings.base || '') + path), fn);

现在只需添加设置:

app.set('base', '/myapp');

这对于纯字符串路径可以很好地工作,为了获得RegEx支持,您将不得不自己在路由器中间件中乱砍,在这种情况下最好提出问题。

就静态提供程序而言,只需在/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

2020-07-07