Javascript node express中的多数据库动态切换

Javascript node express中的多数据库动态切换,javascript,node.js,angular,express,Javascript,Node.js,Angular,Express,我找了很多东西来解决我的问题。但是我没有得到它。 如果有人在这种情况下有经验,请帮助我 我在node express中创建了一个应用服务器,其中包含MySQL数据库。 并成功创建成功运行的RESTAPI端点 但是我们的项目扩大了。一个新的客户正在接近,所以我们也需要为这些客户提供服务。 这些客户端可能有1k个用户。但数据库架构是相同的 解决方案1:为每个具有不同端口号的客户端创建单独的服务器和数据库。 但我认为这不是一个好的解决方案,因为如果我们有100个客户端,我们就无法维护代码库 解决方案2

我找了很多东西来解决我的问题。但是我没有得到它。 如果有人在这种情况下有经验,请帮助我

我在node express中创建了一个应用服务器,其中包含MySQL数据库。 并成功创建成功运行的RESTAPI端点

但是我们的项目扩大了。一个新的客户正在接近,所以我们也需要为这些客户提供服务。 这些客户端可能有1k个用户。但数据库架构是相同的

解决方案1:为每个具有不同端口号的客户端创建单独的服务器和数据库。 但我认为这不是一个好的解决方案,因为如果我们有100个客户端,我们就无法维护代码库

解决方案2:为每个客户端创建一个单独的数据库,并在运行时切换数据库连接。 但我不明白如何实现解决方案2。非常感谢您的任何建议

如果多个客户端请求同一服务器,则如何知道需要使用端点URL连接哪个数据库。我认为没有其他办法来解决这种情况

我的解决方案是:创建一个中间件,找出需要哪个数据库并返回连接字符串。这是个好主意

中间件。在下面的示例中,我使用包含数据库名称的JWT令牌

const dbHelper=new db();
class DbChooser {
constructor(){
    this. db=
        {
            wesa:{
                host: "xxx",
                user: "xxxx",
                password: "xxxxx",
                database: "hdgh",
                connectionLimit:10,
                connectTimeout:30000,
                multipleStatements:true,
                charset:"utf8mb4"
            },
            svn:{
                host: "x.x.x.x.",
                user: "xxxx",
                password: "xxx",
                database: "xxx",
                connectionLimit:10,
                connectTimeout:30000,
                multipleStatements:true,
                charset:"utf8mb4"
            }

        };
}

async getConnectiontring(req,res,next){
    //console.log(req.decoded);
    let d=new DbChooser();
    let con=d.db[req.decoded.userId];
    console.log(mysql.createPool(con));
    next();
}
}
module.exports=DbChooser;

您可以创建一个配置JSON。在每个请求上,请求头都应该有一个客户机id,根据客户机id我们可以得到数据库连接的实例

数据库配置JSON

var dbconfig = {
          'client1': {
            databasename: '',
            host: '',
            password: '',
            username: ''
          },
          'client2': {
            databasename: '',
            host: '',
            password: '',
            username: ''
          }
        }
您应该声明一个全局对象,以维护每个客户机的单例数据库实例

global.dbinstances = {};
在每个请求中,您都要检查实例在全局对象中是否已经可用。如果可用,可以继续下一个进程,否则会创建一个新实例

app.use('*', function(req,res) {
   let client_id = req.headers.client_id;
   if(global.instance[client_id]) {
     next();
   } else {
     const config = dbconfig[client_id];
     connectoDb(config, client_id);
   }

}

 function connectoDb(config, client_id) {
      //.. once it is connected

      global.instance.push({client_id: con}); //con refers to the db connection instance.
 }

但是如何通过使用请求来知道需要连接哪个数据库。所有客户端也有相同的端点。如何映射客户端id和数据库。在上面的示例中,对于每个HTTP路由,我首先需要获取连接字符串。Violette DRYYou可以创建一个singleton实例。请帮助完成以下步骤,谢谢。另一个问题是如何知道需要连接哪个数据库。如您所知,如果我从客户端传递一些独特的消息,它将很容易受到攻击。最好的方法是什么?用一些salt值加密客户端id,然后在服务器端解密,这样可以为应用程序增加额外的保护。