一个应用程序与nodejs,每个客户端不同的数据库
我想创build一个应用程序与不同的公司/客户端连接,但使用不同的数据库的nodejs。
例如:
运行在localhost:3001上的应用程序nodejs
在本地主机上运行的Mongo服务器:27017
客户端(CLIENT1)访问nodejs应用程序并修改其数据库中的数据 – > localhost:27017 / client1
另一个客户端(CLIENT2)执行相同的操作,并访问应用程序nodejs,但在localhost中修改其数据:27017 / client2
对于申请该应用程序的每个客户都是如此。
– – – – 编辑 – – – – –
我一直在testing的东西得到我想要的,我想我已经想出了一个可能的解决scheme。 解决scheme是创build一个连接到每个数据库访问。 当你完成访问断开连接。 我不知道这是否是一个好的解决scheme,但我认为这可能是值得的:
index.js
var express = require('express'); var app = express(); var repository = require('./demoqueryrepository') app.get('/createdb', function (req, res) { //TODO: With JWT decode get id client and pass like as param to repository repository.crearDemo(req.query.id, function (err, resp) { if (err) console.log(err) else res.send("resp"); }) }); app.listen(3000, function () { console.log('Example app listening on port 3000!'); });
demomodel.js
var mongo = require('mongoose'); var Schema = mongo.Schema; module.exports = mongo.model('demodto', new Schema({ Name: { type: String }, Code: { type: Number }, }));
demoqueryrepository.js
var _demo = require('./demoquerydto'); var mongo = require('mongoose') var mongoconnect = require('./mongoconnect') module.exports = { crearDemo: function (idclient, callback) { let newdemo = new _demo({ Name: " Demo " + idclient, Code: idclient }) mongoconnect.connect(idclient); newdemo.save(function (error) { if (error) callback(error, null); else { callback(null, "success"); mongo.disconnect(); } }) } }
mongoconnect.js
var mongo = require('mongoose') module.exports = { connect: function (idclient) { mongo.connect('mongodb://localhost:27017/' + idclient, { useMongoClient: true }, function (err, res) { if (err) console.log(err); else console.log("Connected to db") }); } }
当我发起请求时:
本地主机:3000 / CREATEDB ID = 12
本地主机:3000 / CREATEDB ID = 13
本地主机:3000 / CREATEDB ID = 14
在数据库服务器上,使用这些ID创build数据库
你正在做的是做一个多租户nodejs应用程序。
你正在采取的方法有几个缺点:
- 有一个通用数据库的用户ID将告诉哪个数据库连接,然后每个客户端。 这意味着你有n + 1连接。
- 您的应用程序不会扩展,因为您总是会过度地提供/提供您的数据库,或者更糟糕地为每个新客户端进行部署更改。
你认为只有一个数据库,因为架构是相同的? 如果您将每个客户端的默认search范围都考虑在内,那么客户常常不得不访问数据。
我有同样的问题,并写了一篇关于它的博客文章 。