沙发上多个组织的最佳做法

时间:2017-08-07 10:12:38

标签: node.js express couchdb couchdb-nano

所以我有一个使用nano的node express应用程序,其中couchdb作为后端,运行正常。我现在正在研究如何将其扩展到多个组织。

例如,通配符DNS记录允许每个客户https://customername.myapp.com。然后,我将检查主数据库中的req.headers.host,并检查每个请求中的会话cookie等。

我正在努力解决的问题是,后端将如何运作。我想我明白,正确的方法是为每个组织使用数据库,并从模板数据库中复制设计。

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

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

然后在我的函数中:

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

但是当数据库本身是变量时,这将不起作用。我是否应该将查询移动到较低级别,例如nano.get('dbname',query ...或其他什么?

修改

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

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

但是我不明白如何通过沙发对象(“沙发”在我的其余路线中未知)。我试过在'下一个(沙发)'中将它传回去,但这打破了......

1 个答案:

答案 0 :(得分:1)

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

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

模板数据库将用于将设计对象同步到现有或新组织。从技术上讲,您可以使用旧设计的旧组织,它们仍然可以工作,因为数据将保持一致。

在您的情况下,您正在寻找的是这一行:

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

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

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

无论如何,这是一个非常广泛的问题,可以通过多种方式得到解答,并没有特别好的做事方式。

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

例如,我制作了一个绘图程序,用于存储每个数据库的项目,并允许人们在画布上合作绘制。数据库ACL允许我限制对项目中邀请的人的访问。我的NodeJS服务器专门用于WebSockets,而webapp能够在没有NodeJS的情况下直接与couchDB通信。

相关问题