Как поймать ошибку при вставке документа MongoDB, который нарушает уникальный индекс?
Я создаю среднее приложение.
Это моя схема имени пользователя, имя пользователя должно быть уникальным.
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
module.exports = mongoose.model('User', new Schema({
username: { type: String, unique: true }
}));
На моем почтовом маршруте я сохраняю пользователя следующим образом:
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
});
});
})
Если я снова отправлю сообщение с тем же именем пользователя, я получу эту ошибку:
MongoError: insertDocument:: вызвано:: 11000 e11000 дубликат ключа индекс ошибок:
Может кто-нибудь объяснить, как вместо ошибки отправить json типа { succes: false, message: 'User already exist!' }
Примечание: после того, как я опубликую пользователя, я автоматически аутентификация, не нужен пароль или что-то еще.
3 ответа:
Вам нужно будет проверить ошибку, возвращенную методом save, чтобы увидеть, была ли она вызвана для повторяющегося имени пользователя.
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 }); }); })
Попробуйте это:
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 }); }); })
Вы также можете попробовать этот хороший пакет Мангуст-уникальный валидатор что делает обработку ошибок намного проще, так как вы получите ошибку проверки Мангуста при попытке нарушить уникальное ограничение, а не ошибку E11000 от 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!' });