Node.js 多个子域
Node.js multiple subdomains
我正在使用 node.js 构建一个多租户应用程序,其中具有自己子域的不同客户端将访问我的应用程序的单个实例。我的问题是:
应用程序有没有办法找出用户所在的子域?这样,我就可以将用户路由到正确的数据库模式 (postgresql)。
提前致谢!
附加信息:
- 我正在使用 Express 框架
- 我没有使用多个实例,因为我希望有成千上万的用户,而且我不想管理数千个实例。
- 关于子域,我的意思是:
我的应用程序。client1domain.com
我的应用程序。client2domain.com
我的应用程序。client3domain.com
以上每个 url 的 link 到应用程序的同一实例。但是,我需要知道用户在哪个子域上,以便我可以将他们路由到正确的数据库架构。
因为 HTTP/1.1 或更大的 "host" 在请求 object 中反映为 "host" header。你可以这样做:
const setupDatabaseScheme = (host, port) => {
// ...
};
http.createServer((req, res) => {
if (req.headers.host) {
const parts = req.headers.host.split(":");
setupDataBaseSchema(parts[0], parts[1]);
}
});
请注意端口可能未定义;并进行额外检查,如果没有主机 header 或 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
左右(将特定部分与正则表达式匹配)并基于此你可以在 res.locals
上设置一个 属性 ,你可以在后续路由中使用它,或者在未知域的情况下退出.
如果您向 http://localhost:<port>/db
.
发出请求,上面的片段将记录 "a connection to scheme by host: localhost"
我正在使用 node.js 构建一个多租户应用程序,其中具有自己子域的不同客户端将访问我的应用程序的单个实例。我的问题是:
应用程序有没有办法找出用户所在的子域?这样,我就可以将用户路由到正确的数据库模式 (postgresql)。
提前致谢!
附加信息:
- 我正在使用 Express 框架
- 我没有使用多个实例,因为我希望有成千上万的用户,而且我不想管理数千个实例。
- 关于子域,我的意思是:
我的应用程序。client1domain.com
我的应用程序。client2domain.com
我的应用程序。client3domain.com
以上每个 url 的 link 到应用程序的同一实例。但是,我需要知道用户在哪个子域上,以便我可以将他们路由到正确的数据库架构。
因为 HTTP/1.1 或更大的 "host" 在请求 object 中反映为 "host" header。你可以这样做:
const setupDatabaseScheme = (host, port) => {
// ...
};
http.createServer((req, res) => {
if (req.headers.host) {
const parts = req.headers.host.split(":");
setupDataBaseSchema(parts[0], parts[1]);
}
});
请注意端口可能未定义;并进行额外检查,如果没有主机 header 或 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
左右(将特定部分与正则表达式匹配)并基于此你可以在 res.locals
上设置一个 属性 ,你可以在后续路由中使用它,或者在未知域的情况下退出.
如果您向 http://localhost:<port>/db
.