沙发上多个组织的最佳实践

所以我有一个节点表示应用程序使用nano与couchdb作为后端,这是运行良好。 我现在正在研究如何将其扩展到多个组织。

因此,例如,为每个客户提供https://customername.myapp.com的通配DNSlogging。 然后,我将检查主数据库中的req.headers.host,并检查每个请求中的会话cookie等。

尽pipe如此,我正在努力争取我的头脑,后端将如何工作。 我想我明白,正确的方法是为每个组织使用数据库,并从模板数据库复制devise。

但如果这是正确的,我不明白这是如何转换为我的代码使用纳米。 我目前使用这个:

var dbname = 'customer1'; var nano = require('nano')(config.dbhost); var couch = nano.db.use(dbname); 

然后在我的function:

 couch.get(somevalue, function(err, body) { // do stuff }); 

但是,当数据库本身是一个variables时,这是行不通的。 我应该把查询移动到一个较低的水平,例如nano.get('dbname',查询…或其他?

编辑

希望有人可以给我一个例子,说明如何使用中间件来改变依赖于主机头的数据库名称。 我到目前为止:

 app.use(function(req,res,next) { var couch = nano.db.use(req.header.host); next(); }); 

但我不明白如何通过沙发对象(“沙发”在我的路由的其余部分是未知的)。 我已经尝试在“下一个(沙发)”传递回来,但是这打破了它…

首先,我build议让应用程序与单个组织一起工作。 如果您希望每个组织拥有一个数据库,稍后添加更多组织应该相当容易。

我将有一个主数据库和一个模板数据库。 主数据库将是一个数据库,用一些元数据列出服务中的现有组织。 这就是NodeJS首先要查询哪些数据库来获取数据。

模板数据库将用于将devise对象同步到现有的或新的组织。 您可以在技术上将旧的组织devise成旧的,并且他们仍然可以在数据一致的情况下工作。

在你的情况下,你正在寻找的线是这样的:

 var couch = nano.db.use(dbname); 

当你知道要查询哪个数据库时,你必须为你需要的每个dbname创build一个新的nano对象。

只要信息存在于请求标头/会话中,就可以知道直接使用哪个数据库(如果数据库是以域名或项目名称命名的)。

无论如何,这是一个非常广泛的问题,可以用多种方式来回答,没有特别的最佳做法。

您可以在技术上将您的组织放在一个数据库中,如果这对您有用的话。 拆分数据库允许您隔离一些事情并使用ACL,但是您可以从技术上使数据库不仅用于组织,而且用于更具体的事情。

例如,我制作了一个绘图程序,用于存储每个数据库的项目,并允许人们合作绘制canvas。 数据库ACL允许我限制访问项目中邀请的人员。 我的NodeJS服务器技术上仅用于WebSockets,并且webapp可以直接与couchDB进行通信而无需NodeJS。