2012-09-24 10 views
10

ifade Ben mongoose kullanarak bir kayıt formu oluşturduk ve 11000 (kullanıcı zaten, o kullanıcı adıyla var ki bu durumda ben bir err.code olsun 3nasıl çitanýn yinelenen anahtarından kurtarmak +

Olası ifade etmek yinelenen anahtar). Mevcut kullanıcıları nasıl ele almalıyım?

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

Bunu yapmanın daha iyi bir yolu var mı:

Şu ana yapıyorum .... ama hata kodunu kontrol emin değilim iyi yoldur?

+0

oldukça temiz görünüyor. Özellikle size bu konuda tam olarak doğru olmayan şeyler nelerdir? – JohnnyHK

+0

Sadece db ilk önce bir kullanıcı için kontrol etmek yerine bir hata atmak izin vermişti. – chovy

+0

Durumunuzda başka bir çözümü 'daha iyi bir yol' haline getirecektir. Zor olmaya çalışmamak, ancak bu işlevsel olarak doğruysa ve performansı yeterli ve sürdürülebiliyorsa ...? – JohnnyHK

cevap

3

Henüz bu denemedim, ama bu düşünce, hata oluşmasını önlemek olacak değilim budur:

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

Ayrıca biraz daha özlü/unutulmaz olan ancak gerekirse geri verilen verileri kullanmanıza izin vermeyen '.count()' işlevini de kullanabilirsiniz. –

+0

Ps, mongoose'un 'Model.saveUnique ({username: req.body.username}, function (err) {...}) gibi bir şeye sahip olması gerektiğini düşünüyorum; ' –

+0

Yinelenen anahtar hatasını işlemek gerçekten daha güvenli. çünkü user.findOne() 'toplamasının okunduğunda ve user.save() işlevinin yürütüldüğü zamanlar arasında başka bir isteğin kullanıcı tarafından oluşturulmuş olması mümkündür. Yani, API'nizin 5xx hatası verebileceği bir yarış durumu var. Kullanıcının halihazırda var olmamasını beklediğiniz bir form için, sadece kaydetmeye çalışmak ve ardından beklenen bir DuplicateKey hatasını ele almak daha az kod (user.findOne() ') gerekliliğini ortadan kaldırır ve bu yarış koşulunu önler. Varlığın zaten var olmasını beklerseniz, önce yüklemeyi denemek daha doğal olabilir. – binki

13

bu deneyin:

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

hata bu şekilde log doldurmak olmaz.

+0

sahip olduğum şey değil mi? Farkı nedir? ve hatalar kayıtsız olarak gün içinde ortaya çıkıyor ... bunun nasıl farklı olduğundan emin değilsiniz. – chovy

+0

Üzgünüm @chovy, cevabımı biraz değiştirdim. - Hatanın bir "yinelenen anahtar" hatası olmaması ve 'Müşteriye bir başka hata daha ortaya çıkması' durumunda ilk koşullu olarak gerçekleşir. - Hatanın bir "yinelenen anahtar" hatası olması durumunda ikinci koşullu olur. - Hata yoksa, komut verildiği gibi gider. – red

+0

Anladım - teşekkürler. Sorgu bir hata attığından hala hataların kaydedildiğini düşünüyorum. User.findOne (.., function (err, user) {if (! User) new User(); user.save()}); – chovy

İlgili konular