如何在CouchDB中检查可用性和保留用户名

Jas*_*son 5 couchdb

我有一个注册页面,要求用户输入用户名和电子邮件地址.

我需要检查用户名+电子邮件是否可用.如何使用一个HTTP请求执行此操作?

顺便说一下,用户名用作docID.

我现在正在做的是检查docID是否存在,然后使用视图检查电子邮件地址的可用性,但这是2个HTTP请求.

我考虑使用视图发出[用户名,电子邮件]作为密钥,并使用"密钥"参数= [用户名,电子邮件]查询视图.但如果用户名和电子邮件属于不同的现有用户,则无法使用此功能.

Jas*_*ith 1

杰森. 山姆的解决方案非常有帮助,但正如您所说,它可能并不适合您。我可以想到另外两个选择。

假装您回到了 SQL。用户的主键是什么?它既不是用户名也不是电子邮件,而是两列。CouchDB 也是如此。

因此,为了绝对保证唯一性,答案很简单:它必须是 doc _id。例如,对于电子邮件为“jason@gmail.com”的用户“jason”,请发布此文档:

{ "_id": "jason:jason@gmail.com",
  "other stuff": "blah blah blah"
}
Run Code Online (Sandbox Code Playgroud)

这是原子的、事务性的用户创建。它可以:

  • 成功了,现在你有了新的用户文档
  • 失败是因为该 id 已经存在并且您(故意)忘记了该_rev属性。太棒了,该用户/电子邮件组合已被占用!

当然,您可以简单地检查该名称是否可用GET /db/jason:jason@gmail.com。(您可以像数据库一样为 id 添加前缀_users,例如users:jason:jason@gmail.com— 这取决于您。)然后您可以POST稍后将其返回。同时也有可能会被采取,但这在现在网络上很常见的所有“先检查,后预订”形式中都是正常的。

第二个想法更只是仔细考虑你的情况。您说两个用户可以拥有相同的用户名电子邮件。这听起来很奇怪。也许我读错了。以下是一些需要考虑的事情:

  • 几乎没有人与其他人共享电子邮件帐户。为什么不将其作为实际的登录名呢?对于 Facebook 来说已经足够了。那么“用户名”可以只是用户的昵称或系统内的句柄,只是用户文档中的属性。
  • 两个 HTTP 请求可能还不错。我是这样想的:
    • 如果这是一个 3 层架构(专用 Web 服务器、couchdb 后端),那么两个 HTTP 请求没什么大不了的
    • 如果它是 2 层或混合层(浏览器直接访问 couchdb),那么强烈考虑使用 CouchDB 进行身份验证,如CouchDB 书中所述。CouchDB 可以通过表单或 AJAX 为您处理登录。它并不适合所有情况,但绝对物超所值。