【发布时间】:2020-07-31 13:03:26
【问题描述】:
经过大量研究,我找不到任何类似的东西来帮助我解决这个问题。
我有一个节点服务器,有几个环境(开发、测试、演示、产品)。该服务器通过服务部署在 Linux 服务器上的生产环境中。
我需要能够为多个不同的客户提供多个生产环境。
示例: 我有 2 个网址:https://customer1.com 和 https://customer2.com。 这两个客户端的代码是一样的,只是url不同。
对于服务器来说,它必须能够识别哪个客户端正在向它发送请求,因为要发送回客户端的数据是不一样的。 customer1 的数据库与 customer2 的 url 不同。因此,服务器必须进行区分,以便仅返回与发出请求的客户端有关的数据。
我的问题:如何实现这一目标? 我想避免为每个客户端部署 1 个服务器,我知道这会更简单,但可维护性较差。
目前,我正在使用 Express-Session 来定义环境。 事实上,我有一个中间件,它会在 mysql 中查找每个客户端的环境变量:
con.connect(function(err) {
if (err) throw err;
con.query(`SELECT * FROM environments WHERE CLIENT_URL = '${req.headers.origin}'`, function(err, result) {
if (err) throw err;
delete result[0].ID;
for (var prop in result[0]) {
req.session[prop] = result[0][prop];
}
next();
});
con.end();
});
它似乎有效,但对我来说似乎不是很稳定或很可靠,我错了吗?
我可以用什么更好的方法来分离数据,这样就没有 customer1 可以接收来自 customer2 的数据?
感谢您的帮助!
【问题讨论】:
-
您是否为所有客户使用共享数据库?这不是一个简单的问题,有很多方法可以做到,通常由项目的首席开发人员或有丰富经验的人决定。如果数据库是共享的,那么您可以将不同的客户分配给您的用户(在数据库中)并据此查询和接收信息。如果每个客户都有自己的数据库,那么您需要一个单独的主体来保存用户并区分他们。同样在这种情况下,将所有客户数据库保存在一台服务器上也不是一个聪明的主意。
-
非常感谢您的回复。嗯...每个客户端都有自己的数据库,以便分离每个人的数据...它们只能由服务器访问(每个数据库的用户名和密码都保存在mysql中)
-
好吧,这听起来不错,如果你设置了 mysql,我假设用户表有一个“客户”属性,或者用户属于不同的组(以每个客户命名)?在您的前端,当用户登录时,请确保在会话中接收并存储他的“客户”属性(来自 mysql)。然后,当他们向服务器发出请求时,您应该在正文中发送该变量(客户)。服务器现在将知道它需要从中获取数据的客户/数据库。
-
虽然这不是一种非常安全的方法(请求可能被劫持,并且可能人们可以查询不同客户的数据),但它可以完成工作。如果您想确保它正确完成,您将需要访问您的服务器以连接到 mysql 并获取有关当前用户的信息。这是万无一失的,如果您的应用程序不适合内部使用(也可以在线获得),您必须这样做。
-
再次感谢。是的,它是使用存储在 mysql 中的凭据查询数据库的服务器。我的逻辑是将客户端相关数据(= mysql 数据)存储在 req.session 中(如客户端名称、数据库 url、数据库密码等),并在必要时尽快获取 req.session 中的信息,向在将结果发送回客户端之前,包含此信息的数据库。我担心的是一个“错误”(我的错或 Express-Session 错误),它会导致 customer1 从 customer2 接收数据......我不确定我是否很清楚,抱歉。不管怎样,谢谢你的帮助。
标签: javascript node.js environment-variables express-session