提问者:小点点

在NodeJS服务器中为多个客户提供多个生产环境


在研究了很多之后,我找不到任何类似的东西来帮助我解决这个问题。

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

我需要能够为几个不同的客户拥有几个生产环境。

示例:我有两个URL:https://customer1.com和https://customer2.com。 这两个客户端的代码是相同的,只是url发生了变化。

对于服务器来说,它必须能够识别哪个客户端正在向它发送请求,因为要发送回客户端的数据并不相同。 customer1的数据库将位于与Customer2不同的url上。 因此,服务器必须进行区分,以便只返回有关发出请求的客户机的数据。

我的问题:如何实现这一点? 我希望避免每个客户机部署一个服务器,我知道这样做会更简单,但不易维护。

目前,我使用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?

谢谢你的帮助!


共1个答案

匿名用户

跟随你原帖子下的所有评论,你需要做这样的事情:

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

以前,任何用户只要使用任何客户的URL,就可以为该客户查询数据,现在这已经不可能了。

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

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