javascript - 如何在 Expressjs 上捕获错误的用户名或密码?
问题描述
我有一个 POST 路由,它接受用户名和密码,并在成功登录时返回一个令牌。如果用户名或密码为空,则返回错误。但是,如果我提供了错误的用户名或密码,我仍然会收到从提供的信息生成的令牌。如何检查从数据库返回的信息以返回相同的错误用户名或密码错误?这是我的路线:
router.post('/login', (req, res) => {
if (req.body.username == '' || req.body.password == '') {
res.status(401).send({ error: "Wrong username or password" });
} else {
queries.login(req.body.username, req.body.password).then((user) => {
if (res.error) {
res.status(401).send({ error: 'Wrong username or password' });
}
res.json(auth.getToken(user.id, user.username));
});
}
});
这是我的查询:
async login(username, password) {
let getUser = await knex('users').where('username', username);
let user = getUser[0];
try {
if (await argon.verify(user.password_hash, password)) {
return user;
}
} catch (e) {
return e;
}
}
解决方案
在您的登录查询中,您需要针对错误情况抛出错误,例如:
async login(username, password) {
try {
let getUser = await knex('users').where('username', username);
let user = getUser[0];
if (await argon.verify(user.password_hash, password)) {
return user;
}
throw Error('User not verified');
} catch (e) {
throw Error(e.message);
}
}
然后在您的路线中,您可以使用以下方法处理错误情况.catch()
:
router.post('/login', (req, res) => {
if (req.body.username == '' || req.body.password == '') {
res.status(401).send({ error: "Wrong username or password" });
} else {
queries.login(req.body.username, req.body.password)
.then((user) => {
res.json(auth.getToken(user.id, user.username));
});
.catch((error) => {
res.status(401).send({ error: 'Wrong username or password' });
});
}
});
推荐阅读
- php - 将 PHP uniqid 用于文件名是否安全?他们会永远是独一无二的吗?
- html - 图像忽略容器高度
- python - 根据关键字更改列中的特定值
- c# - 列表中有多个相同的元素,如何只显示一次,没有重复?
- javascript - 如何在 Vue 项目中使用 scss 文件和字体
- android - 尝试将 Firebase 存储图像设置为 ImageView Android 时出现问题
- c# - 在 C# 中将数字字符串转换为枚举
- uwp - 如何添加空白 UWP 应用作为另一个空白 UWP 应用的参考?
- r - 将一个列表中的数据框行绑定到另一个列表中的数据框
- angular - 材质对话框没有响应