仅当是电子邮件时,才使用express-validator对电子邮件进行消毒,否则请忽略

问题描述

我正在制作一个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$%%##$2342423DJ'
  },{
    username: 'my_username',password: 'SLDUS##$#fssKDJ'
  }
]

请帮助!
谢谢

解决方法

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

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

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

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

完整示例:

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使用任何第三方软件包:

function validateEmail(email) {
    const re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    return re.test(String(email).toLowerCase());
}