节点表达中的动态多数据库切换

时间:2019-02-28 04:47:15

标签: javascript node.js angular express

我已经进行了很多搜索,以找到解决我的问题的方法。但是没有。 如果有人在这种情况下有经验,请帮助我。

我在用MySQL表达数据库的节点中创建了一个应用服务器。 并成功创建可以正常工作的REST API端点。

但我们的项目规模扩大了。一个新的客户方法,因此我们也需要为这些客户提供服务。 这些客户端可能有1000个用户。但是数据库架构是相同的。

解决方案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;

1 个答案:

答案 0 :(得分:1)

您可以创建配置JSON。在每个请求上,请求标头都应具有一个基于client_id的client_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.
 }