ZBLOG

fetch(arguments[0]) .then((res) => res.text()) .then((scriptText) => { const hookedScript = ` ${hookCode} ${scriptText} `; ...

你的代码确实存在一个问题:如果 HTTP 响应状态码不是 200(比如 404500),它仍然会尝试执行 .text() 并继续后续逻辑。为了确保仅在成功响应(如 200)时处理脚本内容,你需要显式检查响应状态。

修正后的代码

fetch(arguments[0])
    .then((res) => {
        if (!res.ok) { // 检查状态码是否在 200-299 范围内
            throw new Error(`HTTP error! status: ${res.status}`);
        }
        return res.text();
    })
    .then((scriptText) => {
        const hookedScript = `
            ${hookCode}
            ${scriptText}
        `;
        const blob = new Blob([hookedScript], { type: "application/javascript" });
        arguments[0] = URL.createObjectURL(blob);
    })
    .catch((error) => {
        console.error("Fetch failed:", error); // 捕获网络错误或 HTTP 错误
    });

关键修改点

  1. res.ok 检查

    • fetchresponse.ok 属性会在状态码为 2xx(如 200204)时返回 true,其他情况(如 404500)返回 false
    • 如果状态码不合法,通过 throw new Error() 中断流程,跳转到 .catch()
  2. 统一错误处理

    • .catch() 会捕获所有错误(包括网络错误和手动抛出的 HTTP 错误)。

注意事项

  • 跨域请求:如果请求的 URL 跨域且服务器未返回正确的 CORS 头,即使状态码是 200,也可能因跨域限制无法读取内容。
  • Blob URL 释放:生成的 Blob URL 可能会占用内存,必要时可通过 URL.revokeObjectURL()手动释放。


    内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23242

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?