Node.js 多个子域

标签 node.js subdomain multi-tenant

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

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

提前致谢!

附加信息:

  • 我正在使用 Express 框架
  • 我没有使用多个实例,因为我预计会有成千上万的用户,而且我不想管理数千个实例。
  • 关于子域,我的意思是:

myapp.client1domain.com

myapp.client2domain.com

myapp.client3domain.com

上述每个 url 都指向应用程序的同一实例。但是,我需要知道用户在哪个子域上,以便我可以将他们路由到正确的数据库架构。

最佳答案

因为来自 HTTP/1.1 或更高版本的“主机”在请求对象中反射(reflect)为“主机” 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。

更新:

在 express 中我会做类似的事情:

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 发出请求,上面的片段将记录“主机连接到方案:本地主机”。 .

关于Node.js 多个子域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35344588/

相关文章:

node.js - Visual Studio 代码和 Debug模式

node.js - 使用 --inspect-brk 选项时 WebSockets 请求是预期错误

wordpress - .htaccess 子域语言

java - 如何实现Spring Boot Redis Multi-Tenancy ?

database - 保护和加密 Multi-Tenancy 云应用程序共享数据库中的数据

node.js - 使用 nginx 应用程序在基本 url 上运行 NodeJs Express 应用程序

node.js - NodeJS 无法识别 .env 文件

node.js - 使用 Restify 和 Nodejs 的多个子域

nginx - 在 Nginx 变量子域中重定向

c# - Entity Framework Multi-Tenancy 共享数据架构 : single column, 多个外键