如何使用 pouchdb-authentication 检查用户名是否已经存在?

How to check if a user name already exists with pouchdb-authentication?

上下文如下。

pouchdb-authentication API doesn't offer an explicit method for this. I thought about using db.getUser(username [, opts][, callback])。但是,此方法声明:

Note: Only server admins or the user themselves can fetch user data. Otherwise you will get a 404 not_found error.

我做的。

上下文

我想使用异步验证器来检查用户名是否存在,以便在用户单击 'submit' 之前告诉用户用户名是否存在。

我能想到的唯一其他选择是尝试注册以查明用户名是否已经存在,如下所示:

即使 PouchDB 没有这样的功能,您也可以使用 CouchDB 本身来实现它。这是带有管理员凭据的 HTTP GET 请求,returns 所有用户:

$ curl -u admin:admin -X GET http://localhost:5984/_users/_all_docs
{"total_rows":4,"offset":0,"rows":[
{"id":"_design/_auth","key":"_design/_auth","value":{"rev":"1-75efcce1f083316d622d389f3f9813f7"}},
{"id":"org.couchdb.user:admin","key":"org.couchdb.user:admin","value":{"rev":"1-c363450b879aaf64823901816b5690db"}},
{"id":"org.couchdb.user:su","key":"org.couchdb.user:su","value":{"rev":"1-c468424e1e3cc6b76baca17a9a3b7a26"}},
{"id":"org.couchdb.user:suser","key":"org.couchdb.user:suser","value":{"rev":"1-1b0c0623016feb5a5d701b392b60ad84"}}
]}

例如,在服务器端使用 NodeJS/ExressJS,您可以向 CouchDB 发送带有管理员凭据的 HTTP GET 请求并获取所有用户的列表。可以使用 node-fetch.

完成 HTTP 请求

同时,NodeJS/ExpressJS 通过 HTTP POST 请求从 front-end 接收 username 输入字段的值。在 front-end 上,您可以使用 browser fetch API.

然后可以比较username输入框里面的值是不是用户之间的。根据比较,您可以将响应发送回 frontend/browser。 Fetch API 使用 Promise 使所有 HTTP 通信异步。


正如@BernhardGschwantner 所指出的,最好先 fetch 来自 frontend/browser 的用户名,然后通过向 CouchDB 发送 HTTP 请求来查询该用户名以查看该用户是否存在。

要向 CouchDB 发出 HTTP 请求,您可以发出 HEAD 请求,预计它比 GET 请求更快。如果用户存在,HTTP HEAD 请求 returns 200 OK 以及 ETag 内用户文档的修订如下:

$ curl -I -X HEAD http://admin:****@192.168.1.106:5984/_users/org.couchdb.user:jan
HTTP/1.1 200 OK
X-CouchDB-Body-Time: 0
X-Couch-Request-ID: fbae21471c
Server: CouchDB/2.1.1 (Erlang OTP/18)
ETag: "3-f11b227a6e1236fa502af668fdbf326d"
Date: Fri, 30 Mar 2018 08:29:55 GMT
Content-Type: application/json
Content-Length: 263
Cache-Control: must-revalidate

如果用户不存在,HTTP HEAD 请求 returns 404 Object Not Found 没有任何 ETag,如下所示:

$ curl -I -X HEAD http://admin:****@192.168.1.106:5984/_users/org.couchdb.user:jerk
HTTP/1.1 404 Object Not Found
X-CouchDB-Body-Time: 0
X-Couch-Request-ID: ddccff4105
Server: CouchDB/2.1.1 (Erlang OTP/18)
Date: Fri, 30 Mar 2018 08:35:10 GMT
Content-Type: application/json
Content-Length: 41
Cache-Control: must-revalidate