如何在同一个 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,后者可能会提供有效的解决方案。
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,后者可能会提供有效的解决方案。