当前位置: 首页 > 知识库问答 >
问题:

node.js多个子域

秦博达
2023-03-14

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

有没有一种方法可以让应用程序发现用户在哪个子域上?这样,我就可以将用户路由到正确的数据库模式(postgresql)。

提前道谢!

其他信息:

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

myapp.client1domain.com

myapp.client2domain.com

myapp.client3domain.com

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

共有1个答案

阮桐
2023-03-14

因为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,则添加错误处理。当然,您也可以作为一个express中间件来做类似的工作,或者使用任何类似的框架,这只是一个裸的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左右(将特定部分与regexp匹配),并在此基础上设置res.locals上的属性,您可以在后续路由上使用该属性,或者在未知域的情况下退出。

如果您对http://localhost: /db 执行请求,上述片段将记录“通过主机:localhost连接到scheme”。

 类似资料:
  • 我是Node.js的新手,我在我的sql数据库2表中,一张叫做俱乐部的桌子和一张叫做球员的桌子,它们通过一对多的关系联系在一起,所以我在Flutter中创建了一个post查询,从我的查询中我想发送俱乐部的名字,俱乐部的价格将他们插入到第一个表中,并且在同一个查询中发送该队的选定球员列表,并做一个循环将他们插入到第二个表中,并为每个球员插入俱乐部的id,但是我发现我自己不知道我应该在Flutter或

  • 问题内容: 我要实现的目标是创建一个包含多个功能的模块。 module.js: 我的问题是,这是一个对象类型,而这是一个URL字符串,但是当我遇到该问题时,它总是抱怨该类型是错误的。 在这种情况下,如何声明多个module.exports? 问题答案: 您可以执行以下操作: 要不就: 然后在调用脚本中:

  • 预期结果: 如有任何帮助,我们将不胜感激!

  • 问题内容: 我是事件/回调样式编程和NodeJS的新手。我正在尝试实现一个小的http服务器,它使用node-mysql模块来提供ddbb数据。 我的问题来自查询结构。由于经常有一些查询需要运行先前查询的结果,因此我无法同时(异步)运行所有查询,因此不得不等待一些结果。 我的第一种方法是同时运行所有非依赖性查询,然后循环运行,直到所有非依赖性查询都设置了一个标志,说我已经完成,这样我就可以继续处理

  • 问题内容: 我正在 使用Express Framework 在 Node.js上 编写CMS 。在我的CMS上,我有几个用于用户,页面等的模块。 我希望每个模块的文件都放在 单独的文件夹中 , 包括视图文件 。有人知道我该怎么做到吗? 我将 swig 用作模板引擎,但如果有帮助,可以将其替换为其他东西。 问题答案: 最后更新 自Express 4.10起,框架支持多视图文件夹功能。 只需将一系列位

  • 问题内容: 我有使用socket.io(1.5)的这个简单的node.js Servercode: 如果我运行此代码并按几次F5键,则在某些情况下会在断开旧连接之前创建新的连接。一段时间后,我认为它的心跳超时,所有连接都将关闭。查看结果: 我的问题是:这是Bug还是socket.io的正常行为?只需按F5键,如何防止连接泛滥? 最好的问候马克 问题答案: 我制作了自己的测试应用程序,能够弄清楚发生