You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 06:15:03