Node.js有多个子域

我正在使用node.js构build一个多租户应用程序,其中具有自己的子域的不同客户端将访问我的应用程序的单个实例。 我的问题是:

有没有办法让应用程序找出用户在哪个子域? 这样,我可以将用户路由到正确的数据库模式(postgresql)。

提前致谢!

附加信息:

  • 我正在使用Express框架
  • 我没有使用多个实例,因为我希望有成千上万的用户,我不想pipe理数千个实例。
  • 关于子域,我的意思是这样的:

myapp.client1domain.com

myapp.client2domain.com

myapp.client3domain.com

上面的每个url链接到应用程序的同一个实例。 但是,我需要知道用户在哪个子域,所以我可以将它们路由到正确的数据库模式。

由于来自HTTP / 1.1或更高版本的“主机”在请求对象中被反映为“主机”头部。 你可以做这样的事情:

 const setupDatabaseScheme = (host, port) => { // ... }; http.createServer((req, res) => { if (req.headers.host) { const parts = req.headers.host.split(":"); setupDataBaseSchema(parts[0], parts[1]); } }); 

请注意,端口可能是未定义的; 并做额外的检查,如果没有主机头或HTTP版本低于1.1,则添加error handling。 当然,你可以做类似的expression中间件,或任何类似的框架,这只是光秃的node.js http。

更新:

在expression我会做这样的事情:

 const getConnecitonForSchemeByHost = (host) => { // ... get specific connection for given scheme from pool or similar return "a connection to scheme by host: " + host; }; router .all("*", function (req, res, next) { const domain = req.get("host").split(":")[0]; const conn = res.locals.dbConnection = getConnecitonForSchemeByHost(domain); if (conn) { next(); } else { next(new Error("no connection for domain: " + domain)) } }) .get("/", function (req, res) { // use connection from res.locals at further routes console.log(res.locals.dbConnection); res.send("ok"); }); app.use("/db", router); 

req.get("host")让你回到请求所指向的主机,例如myapp.client1domain.com (用特定的正则expression式匹配特定的部分),并根据你可以在res.locals上设置属性,你可以在后续路线上使用,或在未知域名的情况下救助。

如果你对http://localhost:<port>/db进行了请求,上面的剪切会logging“通过host:localhost连接到scheme”。