2015-06-02 11 views
12

Buduję aplikację MEAN.Jak złapać błąd podczas wstawiania dokumentu MongoDB, który narusza unikalny indeks?

To jest mój schemat nazwy użytkownika, nazwa użytkownika powinna być unikalna.

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

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

Na mój post trasie zapisać użytkownikowi tak:

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 
      }); 

     }); 
    }) 

Gdybym pisać o tej samej nazwie znowu mam ten błąd:

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

Może ktoś wyjaśnić jak zamiast błędu wysyłania json jak { succes: false, message: 'User already exist!' }

Uwaga: po opublikowaniu użytkownika zrobię aut omatyczne uwierzytelnienie, nie potrzebujesz hasła ani czegoś innego.

Odpowiedz

23

trzeba będzie przetestować błąd zwrócony z metody ratowania aby sprawdzić, czy został wrzucony do powielania użytkownika.

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

Spróbuj tego:

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

Dzięki, działa jak wyjątek, myślałem o tym, ale myślałem, że błąd może zwrócić coś innego niż błąd istniejącego użytkownika, jestem w błędzie? – Hiero

+4

Tak, ale jest to typowy przypadek: "spróbuj zapisać użytkownika", a jeśli wystąpi błąd, uważasz, że użytkownik jest duplikatem. Możesz pokazać użytkownikowi prostą wiadomość typu "użytkownik już istnieje", a następnie zapisać na swoim logu prawdziwy błąd, aby sprawdzić, czy są błędy z bazą danych. –

2

Można również wypróbować ten miły pakiet mongoose-unique-validator co sprawia, błąd obsługi znacznie łatwiejsze, ponieważ dostaniesz błąd sprawdzania poprawności Mongoose podczas próby naruszać ograniczenie przez unikalność, raczej niż E11000 błędu z 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!' }); 
Powiązane problemy