如何在Node JS中验证Email ID的唯一性



我试图验证电子邮件ID的唯一性,当用户输入重复的电子邮件ID时,它应该显示警告。

有没有办法得到想要的输出?

我尝试了下面的条件,但它不会在浏览器中显示警告。

email: {
type: String,
unique : true 
}
下面的代码片段属于"employee.model.js"文件。

const mongoose = require('mongoose');
var employeeSchema = new mongoose.Schema({
fullName: {
type: String,
required: 'This field is required.'
},
email: {
type: String,
unique : true 
},
mobile: {
type: String
},
city: {
type: String
}
});
mongoose.model('Employee', employeeSchema);

下面的代码片段属于"employeeController.js"文件

const express = require('express');
var router = express.Router();
const mongoose = require('mongoose');
const Employee = mongoose.model('Employee');
router.get('/', (req, res) => {
res.render("employee/addOrEdit", {
viewTitle: "Insert Employee"
});
});
router.post('/', (req, res) => {
if (req.body._id == '')
insertRecord(req, res);
else
updateRecord(req, res);
});

function insertRecord(req, res) {
var employee = new Employee();
employee.fullName = req.body.fullName;
employee.email = req.body.email;
employee.mobile = req.body.mobile;
employee.city = req.body.city;
employee.save((err, doc) => {
if (!err)
res.redirect('employee/list');
else {
if (err.name == 'ValidationError') {
handleValidationError(err, req.body);
res.render("employee/addOrEdit", {
viewTitle: "Insert Employee",
employee: req.body
});
}
else
console.log('Error during record insertion : ' + err);
}
});
}
function handleValidationError(err, body) {
for (field in err.errors) {
switch (err.errors[field].path) {
case 'fullName':
body['fullNameError'] = err.errors[field].message;
break;
case 'email':
body['emailError'] = err.errors[field].message;
break;
default:
break;
}
}
}
module.exports = router;

我建议将文件夹结构划分为

  • Routes(包含所有路由)
  • 中间件(所有验证都在其中)
  • 控制器(其中执行整个功能)

假设我们想在用户每次注册时验证一个唯一的电子邮件

我们的routes文件夹将包含userRoute.js

router.post(
'/signup',
users_validation.validateRegister, // calling validation middle-ware 
userController.createUser  // calling user controller 
);

在我们的users_Validation.js文件中,我们使用express-validator

验证用户输入
/ validate our user inputs for registration
exports.validateRegister = [
body('fullName').isLength({
min: 2,
}),
body('email').isEmail().withMessage("isn't vaild").trim().escape(),
body('phone')
.isNumeric()
.withMessage('Phone must be numberic value')
.trim()
.escape(),
// after we validate the inputs we check for errors
//if there are any. just throw them to the user
// if no errors, call next, for the next middleware
(req, res, next) => {
const errors = validationResult(req);
// check if the validation passes, if not
// return a json respond with an error message
if (!errors.isEmpty()) {
let field = errors.errors[0].param;
let message = errors.errors[0].msg;
let errorMessage = field + ' ' + message;
res.status(400).json({
message: errorMessage,
errors: errors,
});
} else {
next();
}
},
];

Next()函数将调用我们的控制器createUser.js

exports.createUser = (req, res) => {
User.findOne({ email: req.body.email }, (err, userWithSameEmail) => {
if (err) {
res.status(400).json({
message: 'Error getting email try gain',
});
} else if (userWithSameEmail) {
res.status(400).json({ message: 'This email is taken' });
} else {
const newUser = new User({
fullName: req.body.fullName,
email: req.body.email,
phone: req.body.phone,
});
newUser
.save()
.then((user) => {
res.json(user);
})
.catch((err) => {
res.status(400).json({
message: 'Error registering',
err,
});
});
}
});
};

我希望这将做你的工作,但我强烈建议使用Firebase身份验证来处理你的用户身份验证,它将使你的工作比自己编写整个逻辑容易得多。

最新更新