为何手动 promisify 封装的 JWT.verify 无法正常返回 decoded_token
问题根因分析
1. 回调参数顺序写反(90%以上是这个问题)
原生jsonwebtoken库的jwt.verify是标准的错误优先回调设计,回调函数的入参顺序为(error, decoded_token),第一个参数是报错对象(验证失败时非空),第二个参数才是解码后的有效载荷。
如果你封装Promise的时候把回调参数的顺序写反了,比如写成(decoded, err) => {},那么验证成功时第一个入参永远是null,你resolve的就是空值,自然拿不到解码结果。
错误封装示例:
// 错误写法 function PromisifiedJWTVerify(token, secret) { return new Promise((resolve, reject) => { // 参数顺序写反,把decoded放在了第一位 jwt.verify(token, secret, (decoded, err) => { if (err) reject(err) resolve(decoded) }) }) }
正确封装示例:
// 正确写法 function PromisifiedJWTVerify(token, secret, options) { return new Promise((resolve, reject) => { // 错误参数在前,解码结果在后 jwt.verify(token, secret, options ?? {}, (err, decoded) => { if (err) return reject(err) resolve(decoded) }) }) }
2. 调用时参数缺失/非法
如果调用封装方法时漏传了密钥、传入了格式非法的token、或者options参数不符合要求,会导致jwt.verify直接抛出同步错误,没有进入回调逻辑,resolve自然不会被触发。你可以在封装外层加一层try catch捕获同步错误,避免程序直接崩溃。
3. 回调位置错误
如果你封装时把回调函数放在了第三个参数的位置,调用时又传入了自定义配置项,就会把回调函数覆盖,导致jwt.verify没有收到回调方法,不会返回任何结果。
内容的提问来源于stack exchange,提问作者Muhib Ahmed
相关产品推荐
相关产品推荐

