javascript - JavaScript 条件语句表现不同
问题描述
我有一个端点localhost:3000/users/add
和localhost:3000/users/login
. 当用户登录服务器时,将返回一个 Jsonwebtoken,其中包含以下格式的两个属性:user: { username: 'user_name', access_level: 4 }
. 然后我有一个auth
自定义中间件来验证用户的 access_level 并使用它来保护localhost:3000/users/add
. 然后路线如下所示:
路由器.js:
router.post('/add', auth, async (req, res, next) => {
// get user input
const user = req.body;
try {
const data = await Helper.validateUserInput(user)
// encrypt password
const hash = await Helper.encryptPassword(data.value.password)
if(hash) {
const databaseUser = new User({
'username': data.value.username,
'password': hash,
'access_level': data.value.access_level
});
// persist to database
const saved = await databaseUser.save();
console.log(saved);
res.status(200).json({success: true, message: `User successfully added`})
}
}
// if there's an error
catch(error){
if(error.hasOwnProperty('code')) {
const error_code = error.code;
if(error_code === 11000) {
return res.status(400).json({
success: false,
error_message: error.errmsg
})
}else {
return res.status(500).json({
success: false,
error: error
})
}
}
}
});
auth中间件函数如下:
auth.js:
const Helper = require('../helpers/helpers')
module.exports = function async (req, res, next) {
const token = req.query.token;
if(!token) {
res.status(403).json({
success: false,
error_message: `Forbiden - Invalid credentials!`
})
}
Helper.verify_token(token)
.then((user) => {
const { access_level } = user.user;
console.log(access_level)
if(access_level != 4) {
res.status(401).json ({
success: false,
error_message: `Unauthorized - Invalid credentials!`
})
}else {
next()
}
})
.catch((err) => {
res.status(403).json({
success: false,
error_message: `Forbiden - Invalid credentials!`
})
})
}
然后我尝试访问受保护的路线,邮递员只是挂起并且没有给出响应。但奇怪的是,如果我改变if statement
例如auth.js
:
if(access_level != 1) {
res.status(401).json ({
success: false,
error_message: `Unauthorized - Invalid credentials!`
})
}else {
next()
}
一切正常。我真的不明白这里的问题是什么。
解决方案
更改添加功能
router.post('/add', auth, async (req, res, next) => {
// get user input
const user = req.body;
try {
const data = await Helper.validateUserInput(user)
// encrypt password
const hash = await Helper.encryptPassword(data.value.password)
if (hash) {
const databaseUser = new User({
'username': data.value.username,
'password': hash,
'access_level': data.value.access_level
});
// persist to database
const saved = await databaseUser.save();
console.log(saved);
return res.status(200).json({ success: true, message: `User successfully added` })
} else {
return res.status(500).json({
success: false,
error: "Please try again"
})
}
}
// if there's an error
catch (error) {
if (error.hasOwnProperty('code')) {
const error_code = error.code;
if (error_code === 11000) {
return res.status(400).json({
success: false,
error_message: error.errmsg
})
} else {
return res.status(500).json({
success: false,
error: error
})
}
}
else {
return res.status(500).json({
success: false,
error: error
})
}
}
});
并更改身份验证中间件
const Helper = require('../helpers/helpers')
module.exports = function async (req, res, next) {
const token = req.query.token;
if(!token) {
res.status(403).json({
success: false,
error_message: `Forbiden - Invalid credentials!`
})
}
else{
Helper.verify_token(token)
.then((user) => {
const { access_level } = user.user;
console.log(access_level)
if(access_level != 4) {
res.status(401).json ({
success: false,
error_message: `Unauthorized - Invalid credentials!`
})
}else {
next()
}
})
.catch((err) => {
res.status(403).json({
success: false,
error_message: `Forbiden - Invalid credentials!`
})
})
}
}
推荐阅读
- reactjs - 附加 react-redux 的提供者给了我一个无效的钩子错误
- python - 如何将此多折线图更改为条形图?
- ios - Swift 4 中的 UIButtonClick 上的嵌入式 UITableView 未使用 reloadData() 重新加载
- swift - 通用视图配置器
- c# - 我无法在 C# 上加载预训练的 CNTK 模型
- javascript - 带有 JSON 列表变量的 ChartJS 散点图不起作用
- android - 为什么 addSnapshotListener 在 firestore CollectionReference 上被调用两次?
- java - 如何解决@OneToMany 关系中的重复列名异常
- react-native - 如何修复启动画面后出现的白屏 - 反应原生
- ios - 更改视图的 y 位置会删除点击事件