Javascript node express中的多数据库动态切换
我找了很多东西来解决我的问题。但是我没有得到它。 如果有人在这种情况下有经验,请帮助我 我在node express中创建了一个应用服务器,其中包含MySQL数据库。 并成功创建成功运行的RESTAPI端点 但是我们的项目扩大了。一个新的客户正在接近,所以我们也需要为这些客户提供服务。 这些客户端可能有1k个用户。但数据库架构是相同的 解决方案1:为每个具有不同端口号的客户端创建单独的服务器和数据库。 但我认为这不是一个好的解决方案,因为如果我们有100个客户端,我们就无法维护代码库 解决方案2:为每个客户端创建一个单独的数据库,并在运行时切换数据库连接。 但我不明白如何实现解决方案2。非常感谢您的任何建议 如果多个客户端请求同一服务器,则如何知道需要使用端点URL连接哪个数据库。我认为没有其他办法来解决这种情况 我的解决方案是:创建一个中间件,找出需要哪个数据库并返回连接字符串。这是个好主意 中间件。在下面的示例中,我使用包含数据库名称的JWT令牌Javascript node express中的多数据库动态切换,javascript,node.js,angular,express,Javascript,Node.js,Angular,Express,我找了很多东西来解决我的问题。但是我没有得到它。 如果有人在这种情况下有经验,请帮助我 我在node express中创建了一个应用服务器,其中包含MySQL数据库。 并成功创建成功运行的RESTAPI端点 但是我们的项目扩大了。一个新的客户正在接近,所以我们也需要为这些客户提供服务。 这些客户端可能有1k个用户。但数据库架构是相同的 解决方案1:为每个具有不同端口号的客户端创建单独的服务器和数据库。 但我认为这不是一个好的解决方案,因为如果我们有100个客户端,我们就无法维护代码库 解决方案2
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,然后在服务器端解密,这样可以为应用程序增加额外的保护。