2010-07-06 89 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"] 

如果相同的用戶名和密碼,你的文檔中存在,將返回的數據。

相關問題