首页 > 解决方案 > JavaScript 条件语句表现不同

问题描述

我有一个端点localhost:3000/users/addlocalhost: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()
 }

一切正常。我真的不明白这里的问题是什么。

标签: javascriptnode.jsexpressjwtpostman

解决方案


更改添加功能

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!`
        })
    })
  }
}

推荐阅读