2010-07-06 7 views
5

Ich habe eine Registrierungsseite, die den Benutzer auffordert, einen Benutzernamen und eine E-Mail-Adresse einzugeben.So prüfen Sie die Verfügbarkeit und reservieren Benutzernamen in CouchDB

Ich muss überprüfen, ob der Benutzername + E-Mail verfügbar ist. Wie mache ich das mit nur einer HTTP-Anfrage?

BTW, der Benutzername wird als docID verwendet.

Was ich gerade mache, ist zu überprüfen, ob die docID existiert, und dann eine Ansicht zu verwenden, um nach der Verfügbarkeit der E-Mail-Adresse zu suchen, aber das sind 2 HTTP-Anfragen.

Ich dachte darüber nach, eine Ansicht zu verwenden, um [Benutzername, E-Mail] als Schlüssel auszugeben und die Ansicht mit einem "Schlüssel" param = [Benutzername, E-Mail] abzufragen. Dies funktioniert jedoch nicht, wenn der Benutzername und die E-Mail-Adresse zu verschiedenen vorhandenen Benutzern gehören.

+0

mögliches Duplikat von [Unique constraints in couchdb] (http://stackoverflow.com/questions/1541239/unique-constraints-in-couchdb) – Flimzy

Antwort

1

Jason. Sams Lösung ist sehr hilfreich, aber wie du sagst, ist es vielleicht nicht perfekt für dich. Ich kann mir zwei andere Möglichkeiten vorstellen.

Täuschen Sie für einen Moment Sie sind wieder in SQL. Was ist der Primärschlüssel eines Benutzers? Es ist weder der Benutzername noch die E-Mail, sondern beide Spalten. Das Gleiche gilt für CouchDB.

Also, absolut garantieren Einzigartigkeit, die Antwort ist einfach: Es muss die doc sein _id. Zum Beispiel für den Benutzer "jason" mit E-Mail "[email protected]", POST diese doc:

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

Das ist eine atomare, Transaktions-, Benutzererstellung. Es könnte:

  • Succeed, so dass Sie nun Ihr neues Benutzerdokument
  • Ausfallen, weil die ID bereits vorhanden ist und Sie (absichtlich) vergessen, die _rev Eigenschaft. Großartig, diese Benutzer/E-Mail-Kombination ist bereits vergeben!

Natürlich einfach Check, wenn der Name Sie können GET /db/jason:[email protected] zur Verfügung steht. (Sie könnten die ID wie die _users Datenbank voranstellen, wie users:jason:[email protected] — es liegt an Ihnen.) Dann können Sie POST es später zurückgeben. Es gibt eine Chance, dass es in der Zwischenzeit genommen wird, aber das ist normal in allen "check first, reserve later" -Formularen, die jetzt im Web ziemlich üblich sind.

Die zweite Idee ist mehr, nur sorgfältig über Ihre Situation nachzudenken. Sie haben gesagt, dass zwei Benutzer denselben Benutzernamen haben können und E-Mail. Das klingt komisch. Vielleicht lese ich falsch. Hier sind einige Dinge zu denken:

  • Fast niemand Aktien eine E-Mail-Konto mit jemand anderem. Warum nicht den tatsächlichen Login-Namen angeben? Es ist gut genug für Facebook. Dann kann der "Benutzername" nur ein Nickname oder Handle eines Benutzers innerhalb des Systems sein, nur eine Eigenschaft im Benutzerdokument.
  • Zwei HTTP-Anfragen sind möglicherweise nicht so schlecht.Ich denke darüber auf diese Weise:
    • Wenn dies eine 3-Tier-Architektur (dedizierte Webserver, couchdb Backend), dann zwei HTTP-Anfragen sind keine große Sache
    • Wenn es ein 2-Tier oder Hybrid (wo Browser direkt auf couchdb), dann überlegen Sie sich CouchDB zur Authentifizierung, wie in der CouchDB book beschrieben. CouchDB kann Logins für Sie mit einem Formular oder AJAX verwalten. Es ist nicht perfekt für jede Situation, aber Sie bekommen einen tollen Preis für das Geld.
+0

P.S. Hast du wirklich [email protected]? Glücklicher Bastard! : p – JasonSmith

+0

Ich entschuldige mich für die Antwort auf solch eine alte Frage, aber ich stehe vor der gleichen Frage. "Warum nicht den tatsächlichen Login-Namen? Es ist gut genug für Facebook." 1) Facebook macht das nicht. Facebook verwendet eindeutige numerische IDs, denen E-Mail-Adressen, Namen, Spitznamen * und * Benutzernamen zugeordnet sind. 2) E-Mail-Adressen ändern sich häufig. – Flimzy

0

Sie können Ihre URL mit

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

passieren, dass Daten zurück, wenn der gleiche Benutzername und Passwort in Ihrem Dokument vorhanden sind.

Verwandte Themen