2012-09-24 16 views
10

व्यक्त मैं एक साइनअप फॉर्म बना लिया है नेवला का उपयोग करने और 11000 (व्यक्त 3कैसे नेवला में नकली चाबी से उबरने +

इसकी संभव उपयोगकर्ता पहले से ही, वह उपयोगकर्ता नाम के साथ मौजूद है जो मामले में मैं एक err.code पाने के लिए नकली चाबी)। मुझे मौजूदा उपयोगकर्ताओं को कैसे संभालना चाहिए?

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('/'); 
    }); 

वहाँ ऐसा करने का एक बेहतर तरीका है:

यह अब मैं क्या कर रहा है .... लेकिन मुझे यकीन है कि त्रुटि कोड की जाँच नहीं कर रहा हूँ सबसे अच्छा तरीका है?

+0

सुंदर स्वच्छ लग रहा है। विशेष रूप से आपके बारे में क्या सही नहीं लगता है? – JohnnyHK

+0

बस तथ्य यह है कि मैंने डीबी को पहले उपयोगकर्ता की जांच करने की बजाए त्रुटि को फेंक दिया। – chovy

+0

यह इस बात पर निर्भर करता है कि आपकी स्थिति में एक और समाधान 'बेहतर तरीका' क्या होगा। मुश्किल होने की कोशिश नहीं कर रहा है, लेकिन अगर यह कार्यात्मक रूप से सही है और इसका प्रदर्शन पर्याप्त है और यह रखरखाव योग्य है ...? – JohnnyHK

उत्तर

3

मैं अभी तक इस प्रयास नहीं किया है, लेकिन यह है कि मैं क्या कर रहा हूँ सोच एक त्रुटि के कारण से बचने जाएगा:

//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

आप '.count()' का भी उपयोग कर सकते हैं जो थोड़ा अधिक संक्षिप्त/यादगार है लेकिन यदि आवश्यक हो तो लौटाए गए डेटा का उपयोग करने की अनुमति नहीं देता है। –

+0

Ps, मुझे लगता है कि मोंगोज़ में 'Model.saveUnique ({username: req.body.username}, फ़ंक्शन (गलती) {...}) जैसे कुछ होना चाहिए; ' –

+0

डुप्लिकेट कुंजी त्रुटि को संभालना वास्तव में सुरक्षित है क्योंकि उपयोगकर्ता के बीच 'user.findOne() 'संग्रह और' user.save() 'executes को पढ़ने के बीच उपयोगकर्ता को बनाने के लिए एक अन्य अनुरोध के लिए संभव है। यानी, एक दौड़ की स्थिति है जहां आपका एपीआई 5xx त्रुटि फेंक सकता है। एक ऐसे फॉर्म के लिए जहां आप उपयोगकर्ता को पहले से मौजूद नहीं होने की उम्मीद कर रहे हैं, बस इसे सहेजने की कोशिश कर रहे हैं और फिर अनुमानित डुप्लिकेटकी त्रुटि को संभालना कम कोड है ('user.findOne()' की आवश्यकता नहीं है) और इस दौड़ की स्थिति से बचाता है। यदि आप इकाई को पहले से मौजूद होने की उम्मीद करते हैं, तो इसे पहले लोड करने का प्रयास करना अधिक स्वाभाविक हो सकता है। – binki

13

इस प्रयास करें:

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('/'); 
}); 

आप को भरने नहीं होगा त्रुटि इस तरह से लॉग इन करें।

+0

वह नहीं है जो मेरे पास था? एचटी अंतर क्या है। और त्रुटियों को ध्यान में लॉग में दिखाया जाता है ... सुनिश्चित नहीं है कि यह कैसे अलग है। – chovy

+0

क्षमा करें @chovy, मेरे जवाब को थोड़ा सा संशोधित किया। - पहली सशर्त तब होगी जब त्रुटि "डुप्लिकेट कुंजी" त्रुटि न हो और क्लाइंट को 'एक और त्रुटि दिखाई दे'। - त्रुटि एक "डुप्लिकेट कुंजी" त्रुटि होने पर दूसरी सशर्त होगी। - यदि कोई त्रुटि नहीं है, तो स्क्रिप्ट निर्देश के रूप में जाएगी। – red

+0

मुझे लगता है - धन्यवाद। मुझे अभी भी लगता है कि त्रुटियां लॉग इन हैं, क्योंकि क्वेरी ने एक त्रुटि फेंक दी है। मैं उपयोगकर्ता कर सकता हूं। ढूँढें (.., फ़ंक्शन (गलती, उपयोगकर्ता) {if (! उपयोगकर्ता) नया उपयोगकर्ता(); user.save()}); – chovy