2015-06-02 8 views
12

Sto costruendo un'applicazione MEAN.Come rilevare l'errore quando si inserisce un documento MongoDB che viola un indice univoco?

Questo è il mio schema Nome utente, il nome utente deve essere univoco.

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

module.exports = mongoose.model('User', new Schema({ 
    username: { type: String, unique: true } 
})); 

Il mio percorso post ho salvare l'utente in questo modo:

app.post('/authenticate', function(req, res) { 
     var user = new User({ 
      username: req.body.username 
     }); 

     user.save(function(err) { 
      if (err) throw err; 

      res.json({ 
       success: true 
      }); 

     }); 
    }) 

Se pubblico con lo stesso nome utente ancora ottengo questo errore:

MongoError: insertDocument :: caused by :: 11000 E11000 duplicate key error index:

Qualcuno può spiegare come invece dell'errore per inviare un json come { succes: false, message: 'User already exist!' }

Nota: dopo aver inserito l'utente, io omaticamente authentificate, non ho bisogno di password o qualcos'altro.

risposta

23

sarà necessario verificare l'errore restituito dal metodo save per vedere se è stato gettato un nome utente duplicazione.

app.post('/authenticate', function(req, res) { 
    var user = new User({ 
    username: req.body.username 
    }); 

    user.save(function(err) { 
    if (err) { 
     if (err.name === 'MongoError' && err.code === 11000) { 
     // Duplicate username 
     return res.status(500).send({ succes: false, message: 'User already exist!' }); 
     } 

     // Some other error 
     return res.status(500).send(err); 
    } 

    res.json({ 
     success: true 
    }); 

    }); 
}) 
3

Prova questo:

app.post('/authenticate', function(req, res) { 
     var user = new User({ 
      username: req.body.username 
     }); 

     user.save(function(err) { 
      if (err) { 
       // you could avoid http status if you want. I put error 500 
       return res.status(500).send({ 
        success: false, 
        message: 'User already exist!' 
       }); 
      } 

      res.json({ 
       success: true 
      }); 

     }); 
    }) 
+0

Grazie, funziona come escluso, stavo pensando a questo ma ho pensato che l'errore può restituire qualcosa di diverso dall'errore utente esistente, ho torto? – Hiero

+4

Sì, ma questo è il caso comune: "prova a salvare un utente" e se c'è un errore pensi che l'utente sia duplicato. È possibile mostrare all'utente un messaggio semplice come "l'utente esiste già" e quindi memorizzare nei propri registri l'errore reale per vedere se ci sono errori nel database. –

2

si può anche provare questo bel pacchetto mongoose-unique-validator che rende la gestione degli errori molto più facile, dal momento che si otterrà un errore di convalida Mangusta quando si tenta di violare un vincolo univoco, piuttosto che un errore E11000 da MongoDB:

var mongoose = require('mongoose'); 
var uniqueValidator = require('mongoose-unique-validator'); 

// Define your schema as normal. 
var userSchema = mongoose.Schema({ 
    username: { type: String, required: true, unique: true } 
}); 

// You can pass through a custom error message as part of the optional options argument: 
userSchema.plugin(uniqueValidator, { message: '{PATH} already exists!' }); 
Problemi correlati