Node.js多个子域

时间:2016-02-11 16:19:38

标签: node.js subdomain multi-tenant

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

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

提前致谢!

其他信息:

  • 我正在使用Express框架
  • 我没有使用多个实例,因为我希望拥有数千名用户,而且我不想管理数千个实例。
  • 关于子域名,我的意思是:

myapp.client1domain.com

myapp.client2domain.com

myapp.client3domain.com

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

1 个答案:

答案 0 :(得分:3)

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

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,则添加错误处理。当然你可以做类似的快速中间件,或任何类似的框架,这只是裸node.js http。

更新

在表达中,我会做类似的事情:

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左右(与regexp匹配特定部分)并基于此可以在res.locals上设置一个属性,您可以在后续路由中使用该属性,或者在未知域的情况下进行挽救。

如果您向http://localhost:<port>/db发出请求,上面的剪辑会记录“由host:localhost连接到scheme”。