你的代码确实存在一个问题:如果 HTTP 响应状态码不是 200
(比如 404
或 500
),它仍然会尝试执行 .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 错误
});
关键修改点
res.ok
检查fetch
的response.ok
属性会在状态码为2xx
(如200
、204
)时返回true
,其他情况(如404
、500
)返回false
。- 如果状态码不合法,通过
throw new Error()
中断流程,跳转到.catch()
。
统一错误处理
.catch()
会捕获所有错误(包括网络错误和手动抛出的 HTTP 错误)。
注意事项
- 跨域请求:如果请求的 URL 跨域且服务器未返回正确的 CORS 头,即使状态码是
200
,也可能因跨域限制无法读取内容。 - Blob URL 释放:生成的 Blob URL 可能会占用内存,必要时可通过
URL.revokeObjectURL()
手动释放。
内容由零声教学AI助手提供,问题来源于学员提问