pouchdb-authentication API没有为此提供明确的方法。我考虑过使用db.getUser(username [, opts][, callback])
。然而,这种方法说明了:
注意:只有服务器管理员或用户自己才能获取用户数据。否则,您将收到404 not_found错误。
我做的。
我想使用异步验证器来检查用户名是否存在,以便在用户点击“提交”之前告诉用户用户名是否存在。
我能想到的唯一其他选择是尝试注册以确定用户名是否已经存在如下:
答案 0 :(得分:2)
即使PouchDB没有这样的功能,您也可以使用CouchDB本身实现它。这是带有管理员凭据的HTTP GET请求,它返回所有用户:
$ 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请求,并获取所有用户的列表。 HTTP请求可以使用node-fetch完成。
同时,NodeJS / ExpressJS通过HTTP POST请求从前端接收username
输入字段的值。在前端,您可以使用browser fetch API。
然后,您可以比较username
输入字段中的值是否属于用户。根据比较,您可以将响应发送回前端/浏览器。 Fetch API使用Promise,这使得所有HTTP通信都是异步的。
正如@BernhardGschwantner所指出的,最好先从前端/浏览器fetch
用户名,然后通过HTTP请求查询该用户名,以查看用户是否存在。
要向CouchDB发出HTTP请求,您可以发出一个HEAD请求,该请求预计比GET请求更快。如果用户存在,HTTP HEAD请求将返回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请求将返回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