仅当它是电子邮件时才使用 express-validator 清理电子邮件,否则忽略

Sanitize email using express-validator only if it is an email, otherwise ignore

我正在制作一个 API,其中我将用户名和密码设为 req.body,以便我可以对用户进行身份验证。
(简而言之登录功能)
用户可以输入电子邮件或用户名或手机号码。在后端,如果是电子邮件,我想 规范化 用户名。我这样做是因为我在注册时正常化电子邮件,因此我需要使用正常化电子邮件进行检查。

想做这样的事情:(一个简短的伪代码)

username <- take input from request  
check if username is email:   
  if yes then *sanitize* username

我的登录休息 API 目前:

// Login user
router.post(
  "/login",
  [
    check("username").not().isEmpty().escape(),
    check("password").not().isEmpty().escape(),
  ],
  (req, res, next) => {
    // Finds validation errors and return error object
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
      return res.status(400).json({ errors: errors.array() });
    }
    let { username, password } = req.body;
    // Do authentication part
  }
);

如果输入的是用户名,上面的代码可以正常工作,但我也想规范化电子邮件。

数据库内容如下所示

user : [
  {
    username: 'SOME_MOBILE',
    password: 'SLDUS##$##KDJ'
  },
  {
    username: 'SOME_EMAIL',
    password: 'SLDU$%%##42423DJ'
  },
  {
    username: 'my_username',
    password: 'SLDUS##$#fssKDJ'
  }
]

请帮忙!
谢谢

您可以使用 @hapi/joi 包进行验证。 所以,尝试这样的事情:

const schema = Joi.object().keys({
    username: Joi.string().required(),
    email: Joi.string().email().required()
});

Complete-sample:

const Joi = require('@hapi/joi');

const schema = Joi.object().keys({

    username: Joi.string().required(),
    email: Joi.string().email().required()
});

let username = 'Roger Brown';
let email = 'roger@example';

let data = { username, email };

Joi.validate(data, schema, (err, value) => {

    if (err) {

        console.log(err.details);

    } else {

        console.log(value);
    }
});

如果您不会像这样使用 regex 使用任何 third-party 包:

function validateEmail(email) {
    const re = /^(([^<>()\[\]\.,;:\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,}))$/;
    return re.test(String(email).toLowerCase());
}

如果您希望您的 username 成为这样的电子邮件支票:

[body("username").notEmpty().escape().if(body("username").isEmail()).nomalizeEmail(), 
body("password").notEmpty().escape()]

您可能想添加如下内容:

.stripLow()   //Remove some unwanted ascii codes.
.trim()       //Always trim after removing things.
.notEmpty()   
.escape()     //escape after removing.
.isLength({max: 50 })  //check length after adding things.
.normalizeEmail()      //After all normalize and check if it is a email.
.isEmail(),

对于我使用的普通字符串:

check('name', 'Name must be at least 2 characters long, max 35 characters.')
    .stripLow() //Lowest ascii command codes.
    .trim() //trim after taking out things.
    .notEmpty() //check empty.
    .isLength({ min: 2, max: 35 }) //length before and after adding escapes.
    .escape()
    .isLength({ min: 2, max: 35 }), //length before and after adding escapes.