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

时间:2010-07-06 06:25:11

标签: couchdb

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

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

BTW,用户名用作docID。

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

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

2 个答案:

答案 0 :(得分:1)

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

假装你回到SQL中。用户的主要关键是什么?它既不是用户名也不是电子邮件,而是两列。与CouchDB相同。

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

{ "_id": "jason:jason@gmail.com",
  "other stuff": "blah blah blah"
}

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

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

当然,只需检查,如果名称可用,您可以GET /db/jason:jason@gmail.com。 (您可以像_users数据库一样为id添加前缀,例如users:jason:jason@gmail.com - 这取决于您。)然后您可以稍后再POST。有可能会在同一时间内采取,但这在所有“先检查,保留以后”形式中是正常的,这在网络上很常见。

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

  • 几乎没有人与其他人分享电子邮件帐户。为什么不把它作为实际的登录名?这对Facebook来说已经足够了。然后,“用户名”可以只是用户在系统中的昵称或句柄,只是用户文档中的属性。
  • 两个HTTP请求可能不是那么糟糕。我这样思考:
    • 如果这是一个3层架构(专用的webserver,couchdb后端),那么两个HTTP请求就没什么大不了的了。
    • 如果它是2层或混合(浏览器直接访问couchdb),则强烈考虑使用CouchDB进行身份验证,如CouchDB book中所述。 CouchDB可以使用表单或AJAX为您处理登录。它并不适用于所有情况,但你会获得巨大的收益。

答案 1 :(得分:0)

您可以使用

传递您的网址
http://localhost:5984/yourdatabase/_design/viewname/_view/viewid?key=["username","password"]

如果您的文档中存在相同的用户名和密码,则会返回数据。