2015-06-02 10 views
12

Tôi đang xây dựng một ứng dụng MEAN.Cách nắm bắt lỗi khi chèn tài liệu MongoDB vi phạm một chỉ mục duy nhất?

Đây là lược đồ tên người dùng của tôi, tên người dùng phải là duy nhất.

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

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

Trên tuyến bài của tôi, tôi tiết kiệm cho người sử dụng như thế này:

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

     }); 
    }) 

Nếu tôi đăng với tên người dùng cùng một lần nữa tôi nhận được lỗi này:

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

Ai đó có thể giải thích như thế nào thay vì lỗi để gửi một json như { succes: false, message: 'User already exist!' }

Lưu ý: Sau khi tôi đăng người dùng, tôi sẽ tự động tự xác thực, không cần mật khẩu hay cái gì khác.

Trả lời

23

Bạn sẽ cần phải kiểm tra lỗi trở về từ các phương pháp tiết kiệm để xem nếu nó được ném cho một tên người dùng trùng lặp.

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

Hãy thử điều này:

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

Cảm ơn, hoạt động ngoại trừ, tôi đã nghĩ về điều này nhưng tôi nghĩ rằng lỗi có thể trả lại lỗi khác với lỗi người dùng hiện tại, tôi sai? – Hiero

+4

Có, nhưng đây là trường hợp phổ biến: "cố gắng lưu người dùng" và nếu có lỗi, bạn cho rằng người dùng trùng lặp. Bạn có thể hiển thị cho người dùng một thông điệp đơn giản như "người dùng đã tồn tại" và sau đó lưu trữ trên nhật ký của bạn có lỗi thực sự để xem có sai sót với cơ sở dữ liệu hay không. –

2

Bạn cũng có thể thử gói này đẹp mongoose-unique-validator mà làm lỗi xử lý dễ dàng hơn nhiều, vì bạn sẽ nhận được một lỗi xác nhận Mongoose khi bạn cố gắng để vi phạm một hạn chế duy nhất, chứ không phải hơn một lỗi E11000 từ 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!' }); 
Các vấn đề liên quan