将回调迁移到异步

时间:2018-12-04 16:01:08

标签: jwt hapijs node-mysql2

我正在努力迁移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 :(得分:1)

您可以将VerifyToken函数转换为Promises。

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)
            }
        })
    });
}

现在,您可以使用可与async await表示法一起使用的功能,并通过回调在内部检查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 运算符来调用它。