Node.js加密解密失败时代码不进入else块的问题排查
问题根因与解决方案
核心错误点
- 异步错误捕获逻辑失效:代码混用
async/await与Promise.then写法,外层try/catch无法捕获.then回调内部的同步错误,也无法捕获Data.findById请求失败抛出的异步reject错误,所有错误只会打印在控制台,不会进入你写的else分支 - 解密逻辑判断完全错误:
crypto.createDecipheriv只要参数格式符合要求就会返回解密实例,不会返回空值,你当前写的if (!decipher)判断永远不会成立,且解密失败的报错不会发生在createDecipheriv调用阶段,只会发生在后续调用decipher.update()、decipher.final()的步骤 - 逻辑分支写反:你当前的if分支是decipher不存在时返回成功,else返回失败,和你要的“成功走if失败走else”逻辑完全相反
修正后代码
app.post("/playground3", async (req, res, next) => { try { // 用await替代then,让外层try/catch可以捕获异步错误 const result = await Data.findById(dataId); let key = result.enc_key; let iv = result.iv; let encryptedText = Buffer.from(req.body.data, "base64"); let decipher = crypto.createDecipheriv( "aes-256-cbc", Buffer.from(key), iv ); // 执行解密操作,错误会在这里抛出被catch捕获 let decrypted = Buffer.concat([decipher.update(encryptedText), decipher.final()]); let decryptResult = decrypted.toString('utf8'); // 走到这里说明解密成功,走你原来的if块逻辑 return res.status(200).send({ success: true, encryptData: decryptResult, message: "Data pass IF BLOCK" }); } catch (error) { console.log(error); // 所有错误(数据库查询失败、解密失败、参数错误)都会走到这里,对应你要的else块逻辑 return res.status(404).send({ success: false, message: "Data Not Found" }); } });
调整说明
- 移除冗余的
.then嵌套,统一用await处理异步操作,保证所有同步、异步错误都可以被外层try/catch捕获 - 补充完整的解密执行逻辑,解密失败的错误会直接抛入catch块执行失败逻辑,不需要额外写if/else判断decipher是否存在
- 把原本else块的失败逻辑移到catch中,所有异常场景都会触发失败返回
内容的提问来源于stack exchange,提问作者Smit Gajera
相关产品推荐
相关产品推荐

