**我正在尝试创建一个可以接受用户名或电子邮件的登录路径,其中一个问题是当我对电子邮件或用户名可用而另一个未定义并给出此错误时进行常规查询时,我的正则表达式旨在转义DDos证明,并且也转义caseSensitive,如果其中一个为空,则对两个字段都返回undefined
if (!req.body) {
res.send("Empty body");
}
emailb = req.body.email;
usernameb = req.body.username;
if (emailb || usernameb === undefined) {
let email = req.body.email;
let regex = new RegExp(escapeRegex(email), "gi");
let username = req.body.username;
let regexuser = new RegExp(escapeRegex(username), "gi");
User.find()
.or([{ email: regex }, { username: regexuser }])
.then((user) => {
return bcrypt.compare(req.body.password, user.password);
})
.then((err, valid) => {
if (err) {
res.send("incorrect password");
}
if (valid && !user.verified) {
res.status(401).send("PLEASE VERIFY EITHER EMAIL OR PHONE!");
}
return user;
})
.then((user) => {
const token = jwt.sign(
{
email: user.email,
phone: user.phone,
userid: user._id,
},
process.env.SECRET_JWT
);
res.status(200).json({ token: token, userid: user._id });
}).catch(error => { res.send(error) })
}```
```function escapeRegex(text) {
return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
}```
错误是在promise用法中错误使用promise,我使用了promise,在使用正则表达式作为用户名或邮件时发生了一个有趣的错误,我发现使用一个字段作为用户名和电子邮件比较容易,而我正在使用两个字段用户名和电子邮件,这就是为什么每当字段为空时都会返回未定义的正则表达式的原因,这使另一个令人困惑的错误无法替换,因为我使用了ddos证明攻击模型regex。决定使用1个字段来输入用户名和电子邮件并构造了结构代码很好,就是这样
if (!req.body) {
res.send("Empty body");
}
loginValidation(req.body);
let username = req.body.username;
let regexuser = new RegExp(escapeRegex(username), "gi");
// User.findOne({
// $or:[
// {'condition_1':param}, {'condition_2':param}
// ]},
User.findOne({
$or: [{ username: regexuser }, { email: regexuser }, { phone: req.body.phone }],
})
.then((user) => {
console.log(user);
if (!user) {
return res.status(200).json({
error: `Couldn't find User ${req.body.username}`,
});
} else {
if (!user.verified) {
return res.status(200).json({
token: "",
error: `Please verify Account ${req.body.email} Or PhoneNumber ${user.phone}`,
});
}
bcrypt.compare(req.body.password, user.password, (err, isMatch) => {
if (err) throw err;
});
const token = jwt.sign(
{
email: user.email,
phone: user.phone,
userid: user._id,
},
process.env.SECRET_JWT
);
res.status(200).json({ token: token, userid: user._id });
}
})
.catch((error) => {
res.send(error);
});