[英]Multiple database switching dynamic in node-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;
您可以創建配置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.
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.