Harsha M V
Harsha M V

Reputation: 54949

Mongoose Unique Email Address Validation

I am trying to enforce a Unique Email address when a user signs up. But Mongoose does not seem to be obeying the unique: true flag in my schema.

// NPM Packages
import * as mongoose from 'mongoose';
import * as bcrypt from 'bcrypt';

export const UserSchema = new mongoose.Schema(
  {
    firstName: {
      type: String,
      trim: true,
      required: [true, 'Please enter First Name'],
    },
    lastName: {
      type: String,
      trim: true,
      required: [true, 'Please enter Last Name'],
    },
    email: {
      type: String,
      match: [
        /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
        'Please add a valid email address.',
      ],
      required: [true, 'Please enter Email Address'],
      unique: true,
      lowercase: true,
    },
    password: {
      type: String,
      required: [true, 'Please enter a password'],
      minlength: [6, 'Password must be at least 6 characters'],
      select: false,
    },
  },
  { timestamps: true },
);

// Encrypt User Password
UserSchema.pre('save', async function(next) {
  const salt = await bcrypt.genSalt(10); // Recommended in bcryptjs doc
  this.password = await bcrypt.hash(this.password, salt);
});

Upvotes: 2

Views: 3655

Answers (1)

Jayakumar Thangavel
Jayakumar Thangavel

Reputation: 2005

Use dropDups in your schemas like

email: {
  type: String,
  match: [
    /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\. 
 [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
    'Please add a valid email address.',
  ],
  required: [true, 'Please enter Email Address'],
  unique: true,
  lowercase: true,
  dropDups: true
}

Upvotes: 1

Related Questions