如何在 Node JS 中验证电子邮件 ID 的唯一性

时间:2021-02-24 19:11:01

标签: javascript node.js express mongoose

我正在尝试验证电子邮件 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;

1 个答案:

答案 0 :(得分:0)

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

  • 路线(包括所有路线)
  • 中间件(进行所有验证的地方)
  • 控制器(执行整个功能的地方)

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

我们的路由文件夹将包含 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 Authentication 来处理您的用户身份验证,它会让您的工作比自己编写整个逻辑容易得多。