2

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

例如,通配符 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();
});

但我不明白如何传递沙发对象(“沙发”在我的其余路由中是未知的)。我曾尝试在“下一个(沙发)”中将其传回,但这会破坏它......

4

1 回答 1

1

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

我将有一个主数据库和一个模板数据库。主数据库将是一个数据库,其中列出了服务中的现有组织以及一些元数据。这是 NodeJS 将首先查询的内容,以了解您需要从哪个数据库中获取数据。

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

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

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

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

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

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

如果这对您有用,从技术上讲,您可以将您的所有组织都放在一个数据库中。拆分数据库允许您隔离一些事情并利用 ACL,但从技术上讲,您不仅可以为组织创建数据库,还可以为更具体的事情创建数据库。

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

于 2017-08-09T13:25:43.987 回答