猫鼬:如何防止mongodb在数据库中保存重复的电子邮件记录

Ahm*_*san 4 mongoose mongodb node.js

我想使该集合中的唯一电子邮件变得唯一,但是我无法正常工作,这是我的服务器代码。

// Create a schema
var userSchema = new mongoose.Schema({
    email: { type: String, required: true},
    password: String
});

var userModel = mongoose.model("user", userSchema);

router.post('/postuser', (req, res) => {
    console.log('Requested data to server: ' + JSON.stringify(req.body._user));
var user = new userModel({
    email: req.body._user.email,
    password: req.body._user.password
});
// user.isNew = false;
user.save((err, data) => {
    console.log('Analyzing Data...');
    if(data) {
        console.log('Your data has been successfully saved.');
        res.json(data);
}
else {
  console.log('Something went wrong while saving data.');
  console.log(err);
  res.send(err);
}

})
});
Run Code Online (Sandbox Code Playgroud)

注意:我也尝试了,email: { type: String, required: true, unique: true}但是它不起作用,并显示以下错误。

名称:“ MongoError”,

消息:'E11000重复键错误集合:hutreservationsystem.users

索引:_Email_1 dup键:{:null}',

司机:对,

代码:11000,

索引:0,

errmsg:'E11000重复密钥错误集合:hutreservationsystem.users索引:_Email_1重复密钥:{:null}',

getOperation:[功能],

toJSON:[功能],

toString:[功能]}

Tal*_*wan 6

异步自定义验证器

var userSchema = new mongoose.Schema({
    password: String,
    email: {
        type: String,
        lowercase: true,
        required: true,
        validate: {
            isAsync: true,
            validator: function(value, isValid) {
                const self = this;
                return self.constructor.findOne({ email: value })
                .exec(function(err, user){
                    if(err){
                        throw err;
                    }
                    else if(user) {
                        if(self.id === user.id) {  // if finding and saving then it's valid even for existing email
                            return isValid(true);
                        }
                        return isValid(false);  
                    }
                    else{
                        return isValid(true);
                    }

                })
            },
            message:  'The email address is already taken!'
        },
    }
});
Run Code Online (Sandbox Code Playgroud)

您可能希望将验证器代码更改为es6。


Ahm*_*nes 5

使用此工具的简短回答 mongoose-unique-validator

npm install --save mongoose-unique-validator
Run Code Online (Sandbox Code Playgroud)

在你的模型中

var mongoose = require('mongoose')
var uniqueValidator = require('mongoose-unique-validator')
var userSchema = new mongoose.Schema({
    email: { type: String, required: true, unique: true},
    password: String
});

userSchema.plugin(uniqueValidator)
var userModel = mongoose.model("user", userSchema);
Run Code Online (Sandbox Code Playgroud)

就是这样!(注意唯一:真实)

现在,您的收藏中没有电子邮件重复。

奖金!: 你可以访问错误

.catch(err => console.log(err))
Run Code Online (Sandbox Code Playgroud)

所以在你的例子中

// user.isNew = false;
user.save((err, data) => {
    console.log('Analyzing Data...');
    if(data) {
        console.log('Your data has been successfully saved.');
        res.json(data);
}
else {
  console.log('Something went wrong while saving data.');
  console.log(err);
  res.send(err);
}
Run Code Online (Sandbox Code Playgroud)

访问 err >> 所以你可以 res.send(err.message) >> 'Validation failed'

{
    message: 'Validation failed',
    name: 'ValidationError',
    errors: {
        email: {
            message: 'Error, expected `email` to be unique. Value: `example@gmail.com`',
            name: 'ValidatorError',
            kind: 'unique',
            path: 'email',
            value: 'example@gmail.com'
        }
    }
    }
Run Code Online (Sandbox Code Playgroud)