2012-09-24 17 views
10

Został utworzony formularz rejestracyjny korzystając mangusty i wyrazić 3jak odzyskać z duplikatu klucza w mangusta + wyrazić

Jego możliwe użytkownik już istnieje z tą nazwą użytkownika, w tym przypadku pojawia się err.code 11000 (duplikat klucza). Jak powinienem obsłużyć obecnych użytkowników?

To, co robię teraz .... ale nie jestem pewien, sprawdzając kod błędu jest najlepszym sposobem:

user.save(function(err){ 
    if (err) { 
     console.log(err); 
     console.log(err.code); 

     //duplicate key 
     if (err.code == 11000) { 
     req.flash('error', 'User already exists'); 
     res.redirect('/signup'); 
     return; 
     } 
    } 

    res.locals.user = user; 
    req.session.user = user; 
    //res.locals.session = req.session; 
    res.redirect('/'); 
    }); 

Czy istnieje lepszy sposób to zrobić?

+0

Wygląda całkiem czyste. Co w szczególności nie wydaje ci się do tego słuszne? – JohnnyHK

+0

Tylko to, że pozwoliłem db zwiastować błąd, zamiast być może najpierw sprawdzając użytkownika. – chovy

+0

To zależy od tego, co mogłoby uczynić inne rozwiązanie "lepszym rozwiązaniem" w twojej sytuacji. Nie próbujesz być trudny, ale jeśli jest to funkcjonalnie poprawne, a jego skuteczność jest odpowiednia i możliwa do utrzymania ...? – JohnnyHK

Odpowiedz

3

nie próbowałem tego jeszcze, ale to jest to, co myślę, że będzie unikać powodowania błędu:

//look for existing user first 
user.findOne({ username: req.body.username }, function(err, user) { 
    if (err) throw err; 

    //existing user found, stop registration 
    if (user) { 
     res.flash('error', "That user already exists"); 
     res.redirect('/signup'); 
     return; 
    } 

    //create new user 
    var user = new User({ username: req.body.username }); 

    user.save(function(err){ 
    if (err) throw err; 
     res.flash('info', "Your account has been created"); 
     res.redirect('/account'); 
    }); 
}); 
+0

Możesz także użyć '.count()', który jest nieco bardziej zwięzły/niezapomniany, ale nie pozwala na użycie zwróconych danych, jeśli jest to wymagane. –

+0

Ps, myślę, że mangusta powinna mieć coś takiego jak "Model.saveUnique" ({username: req.body.username}, function (err) {...}); ' –

+0

To jest rzeczywiście bezpieczniejsze w obsłudze błędu duplikatu klucza ponieważ jest możliwe, aby inne żądanie utworzyło użytkownika pomiędzy, gdy 'user.findOne()' odczytuje kolekcję i 'user.save()' zostanie uruchomione. Oznacza to, że Twój interfejs API może rzucić błąd 5xx. W przypadku formularza, w którym oczekuje się, że użytkownik już nie istnieje, po prostu próba jego zapisania, a następnie obsługa oczekiwanego błędu DuplicateKey, jest mniejsza niż liczba kodu (nie ma potrzeby stosowania 'user.findOne()') i unika się tego stanu wyścigu. Jeśli spodziewasz się, że podmiot już istnieje, bardziej naturalne może być najpierw załadowanie go. – binki

13

Spróbuj tego:

user.save(function(err){ 
    if (err && err.code !== 11000) { 
    console.log(err); 
    console.log(err.code); 
    res.send('Another error showed up'); 
    return; 
    } 

    //duplicate key 
    if (err && err.code === 11000) { 
    req.flash('error', 'User already exists'); 
    res.redirect('/signup'); 
    return; 
    } 

    res.locals.user = user; 
    req.session.user = user; 
    //res.locals.session = req.session; 
    res.redirect('/'); 
}); 

nie wypełni błąd logowania w ten sposób.

+0

czy to nie to, co miałem? Co za różnica. i błędy pojawiają się w dzienniku, niezależnie ... nie wiem, jak to jest inaczej. – chovy

+0

Przepraszam za chatkę, trochę zmodyfikowałem swoją odpowiedź. - Pierwsze warunkowe stanie się, gdy błąd nie jest błędem "duplikatu klucza" i zwróci "Innemu błędowi pojawił się" do klienta. - Drugi warunek zostanie spełniony, jeśli błąd jest błędem "duplikatu klucza". - Jeśli nie wystąpi błąd, skrypt przejdzie zgodnie z instrukcjami. – red

+0

Rozumiem - dzięki. Nadal uważam, że błędy są rejestrowane, ponieważ zapytanie zwróciło błąd. Mogę zrobić user.findOne (.., function (err, user) {if (! User) new User(); user.save()}); – chovy

Powiązane problemy