【问题标题】:Multiple database switching dynamic in node-expressnode-express中的多数据库切换动态
【发布时间】:2019-02-28 13:24:27
【问题描述】:

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

我用 MySQL 数据库在 node express 中创建了一个应用程序服务器。 并成功创建成功运行的 REST API 端点。

但我们的项目规模扩大了。一个新的客户接近,所以我们也需要为这些客户提供服务。 这些客户端可能有 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;

【问题讨论】:

    标签: javascript node.js angular express


    【解决方案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.
     }
    

    【讨论】:

    • 但是如何知道我需要使用请求连接哪个数据库。所有客户端也有相同的端点。我如何映射客户端 ID 和数据库。在上面的示例中,对于每个 HTTP 路由,我首先需要获取连接字符串。紫罗兰干
    • 你可以创建一个单例实例。
    • 请您帮忙执行一下步骤
    • 谢谢。另一个是如何知道需要连接哪个数据库。如果我从客户端传递一些独特的信息,如您所知,它容易受到攻击。最好的方法是什么
    • 用一些盐值加密client_id,并在服务器端解密,因此它为应用程序增加了额外的保护。
    猜你喜欢
    • 2019-04-02
    • 2012-04-12
    • 2016-12-17
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    相关资源
    最近更新 更多