JavaScript условное заявление, ведущее себя по-разному - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть конечная точка localhost:3000/users/add и localhost:3000/users/login. Когда пользователь входит на сервер, возвращает Jsonwebtoken с двумя свойствами в следующем формате: user: { username: 'user_name', access_level: 4 }. Затем у меня есть пользовательское промежуточное ПО auth, которое проверяет уровень доступа пользователя, и я использую его для защиты localhost:3000/users/add. Маршрут выглядит следующим образом:

router. 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. 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()
 }

, все будет работать нормально. Я действительно не понимаю, в чем здесь проблема.

1 Ответ

0 голосов
/ 18 февраля 2020

Изменение функции добавления

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!`
        })
    })
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...