正在将回调迁移到异步



我正在努力迁移一个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硬编码到查询中,直到正确的数据到达前端。

有指针吗?

您可以将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'}
}
}

我们刚刚将您的处理程序函数转换为异步函数,并且我们已经有一个返回promise的VerifyToken函数,因此,我们可以使用await运算符调用它。

相关内容

  • 没有找到相关文章

最新更新