Architecture 在NodeJS中基于客户端配置环境变量

Architecture 在NodeJS中基于客户端配置环境变量,architecture,node-modules,Architecture,Node Modules,目前,我们正在使用服务器端的NodeJS作为SaaS应用程序。使用restapi,客户端(Web+Android+iOS)连接到NodeJS应用程序 Nodejs应用程序有一个路由器文件(作为配置文件),它声明了全局变量以连接DB、Redis和AWS,如下所示 现在,我们的一个客户希望他们的数据库是私有的,这意味着不与其他客户机数据共享。换句话说,这个租户不想和其他租户住在一起。只需将此客户端视为租户“L”,如下所示。虽然NodeJS应用程序保持不变,但客户端“L”的数据将存储在不同的服务器中

目前,我们正在使用服务器端的NodeJS作为SaaS应用程序。使用restapi,客户端(Web+Android+iOS)连接到NodeJS应用程序

Nodejs应用程序有一个路由器文件(作为配置文件),它声明了全局变量以连接DB、Redis和AWS,如下所示

现在,我们的一个客户希望他们的数据库是私有的,这意味着不与其他客户机数据共享。换句话说,这个租户不想和其他租户住在一起。只需将此客户端视为租户“L”,如下所示。虽然NodeJS应用程序保持不变,但客户端“L”的数据将存储在不同的服务器中

我需要Stackoverflow社区的帮助,帮助我如何根据客户请求实现/设置不同的全局变量。如何根据客户端请求配置和加载全局变量。或者,实现这一目标的其他可能方式是什么


@Da jin他的问题是全局变量,因此需要确定何时使用哪个池。我建议@Vikram创建一个包装器或中间件,它将返回一个配置对象或标识符,这将帮助您在收到请求后立即决定何时使用哪个配置。同样,在任何情况下,都需要进行更改

或者我建议一个简单的解决方案是创建全局配置对象,如:

config = { 
    shared: {
         mysqlPool : sharedMySqlPoolObj, 
         redisPool: sharedRedispoolObj
 },
 tenantT: {
        mysqlPool : tMySqlpoolObj,
        redispool: tRedispoolObj
  }
}
无论您在哪里进行db或redis连接 只需将代码替换为以下内容:

例如,如果您正在进行我的sql连接

 let clientType = getClientType() // shared or tenantT

globalConfig[clientType].mysqlPool.connect(.....);

它可能有助于避免您进行重大更改

如何加载此配置文件?配置变量在路由器文件中声明。我相信它们是在节点服务器启动时加载的。对于希望拥有自己数据库的客户端,只需将它们设置为一个数据库,并使用另一个mysql.createPool连接到该数据库。感谢您的回复,Dhiraj。问题是在整个节点应用程序中,全局变量用于获取MYSQL连接。我一直在寻找一种基于客户端设置全局变量的方法,但我猜我的方法是错误的,因为NodeJS本质上是无状态的。正确的,这就是为什么我为您提供了一种解决方案,可以动态地获取config。您必须使其动态化才能工作,但这将是一次性更改,将来您可以使用私人池为多个客户端维护应用程序。谢谢,让我试试这个