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

如何在CouchDB中检查可用性和保留用户名,couchdb,Couchdb,我有一个注册页面,要求用户输入用户名和电子邮件地址 我需要检查用户名+电子邮件是否可用。如何仅通过一个HTTP请求来实现这一点 顺便说一句,用户名用作docID 我现在正在做的是检查docID是否存在,然后使用视图检查电子邮件地址的可用性,但这是两个HTTP请求 我考虑使用一个视图来发出[username,email]作为键,并使用“key”参数=[username,email]查询该视图。但是,如果用户名和电子邮件属于不同的现有用户,这将不起作用。Jason。Sam的解决方案很有帮助,但正如你

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

我需要检查用户名+电子邮件是否可用。如何仅通过一个HTTP请求来实现这一点

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

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


我考虑使用一个视图来发出[username,email]作为键,并使用“key”参数=[username,email]查询该视图。但是,如果用户名和电子邮件属于不同的现有用户,这将不起作用。

Jason。Sam的解决方案很有帮助,但正如你所说,它可能并不完全适合你。我可以想出另外两个选择

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

因此,要绝对保证唯一性,答案很简单:它必须是doc
\u id
。例如,对于用户“jason”和“email”jason@gmail.com“,发布此文档:

{ "_id": "jason:jason@gmail.com",
  "other stuff": "blah blah blah"
}
这是一个原子的、事务性的用户创建。它可以:

  • 成功,现在您有了新的用户文档
  • 失败,因为该id已存在,并且您(故意)忘记了
    \u rev
    属性。太好了,那个用户/电子邮件组合已经被使用了
当然,要简单地检查名称是否可用,您可以
GET/db/jason:jason@gmail.com
。(您可以像
\u users
数据库那样为id加前缀,比如
users:jason:jason@gmail.com
-由您决定。)然后您可以
稍后将其发回。有一个机会,它将采取的同时,但这是正常的所有“先检查,保留后”的形式,这是相当常见的网络上现在

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

  • 几乎没有人与其他人共享电子邮件帐户。为什么不把它作为实际的登录名呢?这对Facebook来说已经足够好了。然后“用户名”可以只是系统中用户的昵称或句柄,只是用户文档中的一个属性
  • 两个HTTP请求可能没有那么糟糕。我这样想:
    • 如果这是一个三层架构(专用Web服务器、couchdb后端),那么两个HTTP请求就没什么大不了的了
    • 如果是2层或混合(浏览器直接击中CouCHDB),则强烈考虑使用CouCHDB进行身份验证。CouchDB可以通过表单或AJAX为您处理登录。它不是完美的每一种情况,但你会得到大爆炸的责任

    • 您可以通过

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

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

      p.S.您真的拥有吗jason@gmail.com? 幸运的混蛋pMy为回答这样一个古老的问题而道歉,但我面临着同样的问题。“为什么不把它作为实际的登录名呢?这对Facebook来说已经足够好了。”1)Facebook不这么做。Facebook使用独特的数字ID,其中包含与之相关的电子邮件地址、姓名、昵称和用户名。2) 电子邮件地址经常更改。可能重复的