Reputation: 54949
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
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