Использование экспресс-валидатора, чтобы проверить, является ли ввод имени пользователя или электронной почты - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь подтвердить запрос на вход в систему, когда он принимает имя пользователя, которое может быть либо адресом электронной почты или именем пользователя, и пароль. Как я могу сделать это с 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...
});

С помощью валидатора, я также хотел бы проверить, если это

  • Имя пользователя или адрес электронной почты
  • Если это электронное письмо, убедитесь, что это фактическое электронное письмо с использованием isEmail () 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) {
        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() });
    }
});

Похоже, валидатор просто не работал.

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

Вы можете использовать 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 });
    });

nickname может быть строкой длиной более 3 или электронным письмом.Пароль всегда требуется.Массив валидаторов передается как массив промежуточного программного обеспечения в router.post().handleValidationErrors() - это просто вспомогательная функция.Вы можете использовать ту же логику в реальной логике или использовать try-catch, если хотите.

Я использую isEmail() внутри основного обратного вызова, чтобы проверить, является ли это имя пользователя или адрес электронной почты.Затем я отправляю это в ответ.Вы можете использовать isEmail так, как вам нравится.

0 голосов
/ 23 апреля 2019

Я предлагаю вам использовать Joi валидатор (npm install joi --save)

const Joi = require('joi');

const validateRequest = (schema) => async (req, res, next) => {
    const { error } = Joi.validate(req.body, schema);

    if (error) {  
      throw new Error(error);
    }

    return next();
  };

const validationSchema =  Joi.object().keys({
    nickname:  [Joi.string().email(), Joi.string().min(3)],
    password: Joi.string().required(),
  }),

router.post('/', validateRequest(validationSchema), (req, res) => 
// rest of your code

Но быстрое решение для вашего кода - передать переменную nickname в check, а не строку:

    check(nickname).isLength({ 'min': 3 });
    check(nickname).isEmail();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...