问题描述
我正在制作一个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());
}