如何在同一个 Node 应用程序中的不同端点上创建单独的 PouchDB,使其位于磁盘上的不同数据库中?

How can I create separate PouchDBs on separate endpoints in the same Node app, living in separate databases on disk?

Express-pouchdb 是 Pouchdb-server 的一部分,是一个“完全合格的 Express 应用程序”,它在 Node 中创建了一个与 CouchDB 兼容的数据库,允许基于浏览器的 PouchDB 实例与其同步。

我的目标是让 Node 在不同的端点上创建多个独立的 PouchDB,将它们的数据存储在磁盘上完全不同的路径中。

在 运行宁 npm install express-pouchdb pouchdb express 之后,我从文档中的片段开始:一个端点,一个 PouchDB—

var PouchDB = require('pouchdb');
var express = require('express');
var app = express();

app.use('/db1', require('express-pouchdb')(PouchDB));
app.listen(3000);

这当然没问题。

但是,调整它以添加第二个端点失败:

// same setup as above
app.use('/db1', require('express-pouchdb')(PouchDB));
app.use('/db2', require('express-pouchdb')(PouchDB));
app.listen(3000);

节点立即遇到UnhandledPromiseRejectionWarning: [object Object]。我可以 curl localhost:3000/db1 成功,但 curl localhost:3000/db2 只是挂起。

我尝试以下方法来创建单独的 PouchDB 实例:

// same setup as above
app.use(
    '/db3', require('express-pouchdb')(new PouchDB('db3', {prefix: 'db3/'})));
app.use(
    '/db4', require('express-pouchdb')(new PouchDB('db4', {prefix: 'db4/'})));
app.listen(3000);

Node 会愉快地启动,但是当我 curl localhost:3000/db3 时,Node 抛出:Error: express-pouchdb needs a PouchDB object to route a request!。我以为我给了它一个 PouchDB 对象?

人们如何使用 express-pouchdb 在同一个 Node 应用程序中 运行 多个 PouchDB?

(我的最终目标是为每个经过 Passport.js 身份验证的用户创建一个单独的 PouchDB。我不想使用 Pouch/Couch 身份验证,因为似乎有 security issues在 PouchDB-Server 中。我希望它们位于磁盘上的单独目录中以进行隔离。)

将 Express 应用程序视为 实际 CouchDB 实例会很有帮助。从这个角度来看,考虑如何使用 CouchDB1:

创建一个新数据库
curl -X PUT http://127.0.0.1:5984/{db_name}

从这个角度来看,无需为每个数据库实例创建不同的 PouchDB,而是像为 CouchDB 创建数据库一样。

这段代码只是启动一个服务器,将所有数据库文件放在 sub-directory2

const express = require("express"),
  app = express(),
  PouchDB = require("pouchdb");
// In the current directory, place all database files into a directory named 'database'
const configPouchDB = PouchDB.defaults({ prefix: "./database/" });
app.use("/", require("express-pouchdb")(configPouchDB));
app.listen(3000);

从 shell,启动服务器

$ node app.js

从另一个 shell,点击默认端点,我们看到响应只是 CouchDB-like

$ curl localhost:3000
{"express-pouchdb":"Welcome!","version":"4.2.0","pouchdb-adapters":["leveldb"],"vendor":{"name":"PouchDB authors","version":"4.2.0"},"uuid":"00739d7f-3b78-4a73-b69c-0af98bd819e7"}

现在服务器 运行 可以像使用 CouchDB 一样创建数据库

curl -X PUT http://localhost:3000/db1
{"ok":true}<br/>
curl -X PUT http://localhost:3000/db2
{"ok":true}

现在,如果绝对需要在服务器代码中有特定的 pouchDB 实例,您可以执行以下操作(对于此示例代码,首先删除数据库目录以演示创建)

const express = require("express"),
  app = express(),
  PouchDB = require("pouchdb");
// In the current directory, place all database files into a directory named 'database'
const configPouchDB = PouchDB.defaults({ prefix: "./database/" });
app.use("/", require("express-pouchdb")(configPouchDB));
app.listen(3000);
//
// create databases now 
//
const dbs = {
  db1: new PouchDB("db1"),
  db2: new PouchDB("db2"),
};

服务器启动后,curl 将显示数据库是在启动时创建的。

$ curl localhost:3000/db1
{"doc_count":0,"update_seq":0,"backend_adapter":"LevelDOWN","db_name":"db1","auto_compaction":false,"adapter":"leveldb","disk_size":198,"instance_start_time":"1601040439637"}  

$ curl localhost:3000/db2
{"doc_count":0,"update_seq":0,"backend_adapter":"LevelDOWN","db_name":"db2","auto_compaction":false,"adapter":"leveldb","disk_size":197,"instance_start_time":"1601040439637"}

更新 阅读您的评论后,我现在更了解您的用例。考虑这个

const express = require("express"),
  app = express(),
  PouchDB = require("pouchdb");
// In the current directory, place all database files into a directory named 'database'
const configPouchDB = PouchDB.defaults({ prefix: "./database/" });
const db = require("express-pouchdb")(configPouchDB);

app.use("/", (req, res) => {
  // this simply delegates the request.
  // here you can add conditional logic.
  db(req, res);
});

app.listen(3000);

我建议阅读 Express Middleware3 和 Express Router4,后者可能会提供有效的解决方案。

  1. Create a CouchDB database
  2. Express-PouchDB defaults
  3. Express Middleware
  4. Express Router