使用express-validator检查输入是否是用户名或电子邮件

Jes*_*ess 0 node.js express express-validator

我正在尝试验证登录请求,它接受用户名(可以是电子邮件或用户名)和密码。我如何使用 Express-Validator 来做到这一点?

我正在阅读文档,验证器的工作方式是您必须将数据作为第二个参数传递。我不确定如何检查它是否也是用户名或密码。

router.post("/", (req, res) => {
    const { nickname, password } = req.body;
    // Create a new object based on email or username
    const login = {};
    if (nickname.indexOf('@') === -1) {
        login.nickname = nickname;
    } else {
        login.email = nickname;
    }
    login.password = password;
    // JWT Sign...
});
Run Code Online (Sandbox Code Playgroud)

通过验证器,我还想检查它是否是

  • 用户名或电子邮件
  • 如果是电子邮件,请使用 isEmail() 验证器确保它是真实的电子邮件
  • 如果是用户名,请确保它超过三个字符并且有一个实际的用户名。

试图

router.post("/", (req, res) => {
    const { nickname, password } = req.body;
    // Create a new object based on email or username
    const login = {};
    if (nickname.indexOf('@') === -1) {
        check('nickname').isLength({ 'min': 3 });
        login.nickname = nickname;
    } else {
        check('nickname').isEmail();
        login.email = nickname;
    }
    login.password = password;
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
      return res.status(422).json({ errors: errors.array() });
    }
});
Run Code Online (Sandbox Code Playgroud)

似乎验证器不起作用。

Mik*_*kaS 7

您可以用来oneOf验证用户名或电子邮件。这是一个例子:

const util = require('util');
const { validator } = require('express-validator');
const { check, oneOf, validationResult } = require('express-validator/check');


const validation = [
    oneOf([
        check('nickname')
          .exists()
          .withMessage('nickname is required')
          .isLength({ min: 3 })
          .withMessage('wrong nickname length'),

        check('nickname')
          .exists()
          .withMessage('nickname is required')
          .isEmail()
          .withMessage('nickname not valid'),
    ]),
    check('password')
        .exists()
        .withMessage('password is required')
];

function handleValidationErrors(req, res, next) {
  const errors = validationResult(req);
  if (!errors.isEmpty()) {
    console.log(util.inspect(errors.array()));
    return res.status(422).json({ errors: errors.array() });
  }

  next();
};

router
  .post('/', validation, handleValidationErrors,
    (req, res) => {
      const isEmail = validator.isEmail(req.body.nickname);

      res.status(200).json({ isEmail });
    });
Run Code Online (Sandbox Code Playgroud)

nickname可以是长度超过 3 的字符串或电子邮件。始终需要密码。验证器数组作为中间件数组传递到router.post(). handleValidationErrors()只是一个辅助函数。实际逻辑中你可以有相同的逻辑,或者如果你愿意的话可以使用try-catch。

isEmail()在主回调中使用来检查它是用户名还是电子邮件。然后我在回复中发送该内容。您可以isEmail随心所欲地使用。