仅当它是电子邮件时才使用 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.
我正在制作一个 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.