【问题标题】:Configuring environment variable based on client in NodeJSNodeJS中基于客户端配置环境变量
【发布时间】:2018-06-05 15:18:19
【问题描述】:

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

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

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

我需要 Stackoverflow 社区的帮助,了解如何根据客户请求实现/设置不同的全局变量。如何根据客户端请求配置和加载全局变量。或者还有哪些其他可能的方法来实现这一目标?

【问题讨论】:

  • 你是如何加载这个配置文件的?
  • 配置变量在路由器文件中声明。我相信它们是在节点服务器启动时加载的。
  • 对于需要自己的数据库的客户端,只需将其制作为数据库,并使用另一个 mysql.createPool 连接到它。

标签: architecture node-modules


【解决方案1】:

@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(.....);

也许它可以帮助您避免进行重大更改

【讨论】:

  • 感谢 Dhiraj 的回复。问题出在 Node 应用程序中,全局变量被用来获取 MYSQL 连接。我正在研究一种基于客户端设置全局变量的方式,但我想我以错误的方式接近它,因为 NodeJS 本质上是无状态的。
  • 正确,这就是为什么我为您提供了可以即时获取配置的解决方案。您必须使其动态才能工作,但这将是一次更改,将来您可以使用私有池为多个客户端维护应用程序。
  • 谢谢,让我试试这个
猜你喜欢
  • 2021-06-19
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-10
  • 2012-07-28
  • 2020-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多