Перенос обратных вызовов в Async - PullRequest
0 голосов
/ 04 декабря 2018

Я борюсь с миграцией функции HAPI, которая проверяет токен JWT, а затем выполняет вызов базы данных с использованием декодированных учетных данных.

Проблема заключается в том, что jwt.verify использует обратный вызов, но Hapi и Hapi.MySQL2 был обновлен для использования async функций

Основная функция выглядит следующим образом

exports.LoadAuth = (req, h) => {
  let token = req.headers.authorization.split(' ')[1]
  VerifyToken(token, async function (err, decoded) {
    if (!err) {
      let sql = '#SELECT STATEMENT USING decoded.id'
      const [data] = await mfjobs.query(sql, decoded.id)
      let auids = []
      data.forEach(function (ag) {
        auids.push(ag.Name)
      })
      auids = base64(auids.toString())
      return auids
    } else {
      return {message: 'Not Authorised'}
    }
  })
}

Функция VerifyToken выглядит следующим образом:

VerifyToken = (tok, done) => {
    jwt.verify(tok, Buffer.from(secret, 'base64'), function (err, decTok) {
      if (err) {
        done(err)
      } else {
        done(null, decTok)
      }
    })
  }

Отладка всеговыше работает до того момента, когда данные должны быть возвращены во внешний интерфейс.В этот момент я получаю ERROR 500

Я знаю, что проблема связана с функцией VerifyToken, как будто я опускаю это и жестко кодирую decoded.id в запросе, когда правильные данные достигают внешнего интерфейса.

Есть указатели?

1 Ответ

0 голосов
/ 05 декабря 2018

Вы можете преобразовать свою функцию VerifyToken в Обещания.

let VerifyToken = (tok) => {
    return new Promise((resolve, reject) => {
        jwt.verify(tok, Buffer.from(secret, 'base64'), function (err, decTok) {
            if (err) {
                reject(err)
            } else {
                resolve(decTok)
            }
        })
    });
}

Теперь у вас есть функция, которую вы можете использовать с асинхронным ожиданием и внутренне проверяет проверку jwt с помощью обратных вызовов.

Затем мы можем немного изменить ваш контроллер следующим образом.

exports.LoadAuth = async (req, h) => {
    let token = req.headers.authorization.split(' ')[1];
    try {
        let decoded = await VerifyToken(token);
        let sql = '#SELECT STATEMENT USING decoded.id';
        const [data] = await mfjobs.query(sql, decoded.id);
        let auids = [];
        data.forEach(function (ag) {
            auids.push(ag.Name)
        });
        auids = base64(auids.toString());
        return auids
    } catch (e) {
        return {message: 'Not Authorised'}
    }
}

Мы просто преобразовали вашу функцию-обработчик в асинхронную функцию, и у нас уже есть функция VerifyToken, которая возвращает обещание, поэтому мы можем вызвать ее с помощьюawait оператор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...