2010-07-06 83 views
5

我有一个注册页面,要求用户输入用户名和电子邮件地址。如何检查CouchDB中的可用性和预留用户名

我需要检查用户名+电子邮件是否可用。如何做到这一点只需一个HTTP请求?

顺便说一句,用户名被用作docID。

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

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

+0

[couchdb中的唯一约束]的可能的重复(http://stackoverflow.com/questions/1541239/unique-constraints-in-couchdb) – Flimzy 2015-08-29 23:18:04

回答

1

Jason。然而,正如你所说,山姆的解决方案非常有用,它可能不适合你。我可以想到另外两种选择。

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

所以,以绝对保证的唯一性,答案很简单:它必须是文档_id。例如,对于用户“杰森”用电子邮件“[email protected]”,发布此文档:

{ "_id": "jason:[email protected]", 
    "other stuff": "blah blah blah" 
} 

这是一个原子,交易,用户创建。它可以:

  • 成功,所以现在你有你的新用户文档
  • 失败,因为该ID已经存在,你(故意)忘了_rev财产。太好了,那个用户/邮件组合已经被使用了!

当然,简单地检查如果名称是可用的,你可以GET /db/jason:[email protected]。 (你可以像_users数据库那样加上id前缀,比如users:jason:[email protected] —这取决于你。)然后你可以在POST之后回来。在此期间有可能会被采取,但这在所有“先检查,后期保留”的表单中是正常的,这些表单现在在网络上很常见。

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

  • 几乎没有人与别人的电子邮件帐户。为什么不制作实际的登录名?这对Facebook来说已经足够了。然后,“用户名”可以是用户的昵称或系统内的句柄,只是用户文档中的一个属性。
  • 两个HTTP请求可能并不那么糟糕。我想这样说:
    • 如果这是一个3层架构(专用Web服务器,CouchDB的后端),然后两个HTTP请求,也没什么大不了的
    • 如果是2层或混合(其中浏览器直接点击couchdb),然后强烈考虑使用CouchDB进行身份验证,如CouchDB book中所述。 CouchDB可以使用表单或AJAX为您处理登录。这对于任何情况都不是完美的,但你会得到巨大的回报。
+0

P.S.你真的拥有[email protected]吗?幸运的混蛋! :p – JasonSmith 2010-07-07 04:22:21

+0

我对回答这样一个古老的问题表示歉意,但我面临同样的问题。 “为什么不制作实际的登录名呢?这对Facebook来说足够了。” 1)Facebook不这样做。 Facebook使用唯一的数字ID,其中包含电子邮件地址,姓名,昵称*和*与其关联的用户名。 2)电子邮件地址经常改变。 – Flimzy 2015-08-29 23:15:34

0

你可以通过你的网址与

http://localhost:5984/yourdatabase/_design/viewname/_view/viewid?key=["username","password"] 

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

相关问题