在 NodeJS Server 中为多个客户提供多个生产环境

Have multiple production environment for multiple customers in NodeJS Server

经过大量研究后,我找不到任何类似的东西来帮助我解决这个问题。

我有一个节点服务器,有几个环境(开发、测试、演示、生产)。此服务器通过服务部署在 Linux 服务器上。

我需要能够为多个不同的客户提供多个生产环境。

示例: 我有 2 urls:https://customer1.com and https://customer2.com。 这两个客户端的代码是一样的,只有url处​​有变化。

对于服务器来说,它必须能够识别出是哪个客户端向它发送请求,因为返回给客户端的数据是不一样的。 customer1 的数据库位于与 customer2 不同的 url 上。因此,服务器必须进行区分,以便 return 只有与发出请求的客户端有关的数据。

我的问题:如何实现? 我想避免为每个客户端部署 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();
    });

它似乎可以工作,但对我来说它似乎不是很稳定或很可靠,我错了吗?

我可以用什么更好的方法来分离数据,这样就没有可以从 customer2 接收数据的 customer1?

感谢您的帮助!

在你原来的 post 下的所有评论之后,你需要做这样的事情:

SELECT * FROM environments WHERE CLIENT_URL = '${req.headers.origin}' AND CUSTOMER_NAME 
LIKE yourUserCustomerFromSession

以前,任何用户都可以查询任何客户的数据,只要他们使用该客户的URL,现在这不再可能了。

更好的方法是,如果您不想在会话中保留客户端名称,您可以执行 2 个查询 - 第一个查询获取登录用户的客户端名称,第二个查询类似于上面的代码:

SELECT * FROM environments WHERE CLIENT_URL = '${req.headers.origin}' AND 
CUSTOMER_NAME LIKE theClientNameYouJustGotForTheLoggedInUser