2015-06-02 45 views
12

我正在构建一个MEAN应用程序。如何在插入违反唯一索引的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 :: caused by :: 11000 E11000 duplicate key error index:

有人能解释一下,而不是的错误发送类似{ succes: false, message: 'User already exist!' }

注意:我发布用户后,我会aut omatically认证,不需要密码或其他东西。

回答

23

您将需要测试从保存方法返回的错误,看它是否被抛出了重复的用户名。

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

试试这个:

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

感谢,作品为例外,我在想这一点,但我认为错误可以返回的东西比现有用户的错误一样,我错了吗? – Hiero

+4

是的,但这是常见的情况:“尝试保存用户”,如果出现错误,您认为用户重复。您可以向用户显示一条简单的消息,如“用户已存在”,然后在日志中存储真正的错误,以查看数据库是否存在错误。 –

2

你也可以尝试这个漂亮的包mongoose-unique-validator这使得错误处理要容易得多,因为当你试图违反唯一约束,你会得到一个猫鼬验证错误,而不是从MongoDB的一个E11000错误:

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!' }); 
相关问题