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

自定义decodeURIRecursively递归解码合法URL报错如何修复

问题根因

你的代码核心问题是将整个递归解码的循环包裹在全局try/catch中,且循环判断条件直接调用了decodeURIComponent:

  1. 测试用的合法URL第一次解码后,95%25会被转为95%,此时字符串中存在合法的未编码百分号
  2. 第二次进入循环判断条件时,decodeURIComponent会尝试解析95%,但%后没有跟随两位十六进制字符,直接抛出URIError,触发全局catch逻辑返回空串,导致合法URL解码失败
修复方案

将单次解码操作移入循环内部的try/catch中,每次仅尝试一次解码,根据解码结果判断是继续循环、终止循环还是触发异常处理。以下是符合要求的实现代码:

const decodeURIRecursively = (req, url) => {
  // 必要参数缺失直接返回空
  if (!req || !url) {
    return '';
  }

  let currentUrl = url;
  while (true) {
    try {
      const decodedUrl = decodeURIComponent(currentUrl);
      // 解码结果与原值一致,说明已完成全部解码,退出循环
      if (decodedUrl === currentUrl) {
        break;
      }
      currentUrl = decodedUrl;
    } catch (e) {
      // 解码失败判定为非法编码,返回空串符合异常处理要求
      return '';
    }
  }

  return currentUrl;
};
效果验证
  • 合法URL场景:调用decodeURIRecursively({},"https%3A%2F%2Fgmail.com%3Frate%3D95%25"),返回结果为https://gmail.com?rate=95%,符合预期
  • 非法编码场景:调用decodeURIRecursively({},'%E0%A4%A'),解码失败直接返回空串,符合异常处理要求

内容的提问来源于stack exchange,提问作者Ankita

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 15:03:03