【问题标题】:Sanitize email using express-validator only if it is an email, otherwise ignore仅当它是电子邮件时才使用 express-validator 清理电子邮件,否则忽略
【发布时间】:2020-12-27 05:10:15
【问题描述】:

我正在制作一个 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'
  }
]

请帮忙!
谢谢

【问题讨论】:

    标签: javascript node.js express express-validator


    【解决方案1】:

    您可以使用@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}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
        return re.test(String(email).toLowerCase());
    }
    

    【讨论】:

    • 对不起!但我不允许使用除 express-validator 之外的任何其他包。请尝试建议我使用这个包。
    • 另外它没有澄清我的疑问,我正在使用用户名或密码
    • 所以,使用我添加的正则表达式来回答。
    • 嗯,这将验证我的电子邮件,但它不会清理它(我也想要清理)
    【解决方案2】:

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

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

    【讨论】:

    • 我希望用户名是电子邮件或普通用户名,但如果我使用您的解决方案,如果我提供用户名,它将给出错误响应。
    • 刚刚编辑了帖子,现在您的“用户名”字段将被清理,无论它是否是电子邮件
    • 对不起!在消毒和正常化之间存在理解错误。 Acutally 我想规范化电子邮件。请再次检查已编辑的问题。编辑部分以斜体显示
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 2018-04-07
    相关资源
    最近更新 更多