请求中止 (NS_BINDING_ABORT) 在 Firefox 中,但在其余浏览器中工作

请求中止 (NS_BINDING_ABORT) 在 Firefox 中,但在其余浏览器中工作
最新回答
指环情欲

2021-09-02 19:06:45

问题核心在于 Firefox 浏览器中出现的 NS_BINDING_ABORT 错误,该错误通常与页面导航(如重定向)过程中未正确处理的异步操作或资源释放有关。结合代码分析,主要存在以下潜在原因及解决方案

1. 异步操作未完成时触发重定向
  • 问题:在 onSubmit 函数中,handleGetProfileData() 和 dispatch(login(userData)) 是异步操作,但代码未等待它们完成便直接调用 router.push("/app")。若 Firefox 对未完成的异步操作更敏感,可能导致导航被中止。
  • 修复:使用 async/await 确保所有异步操作完成后再重定向:const onSubmit: SubmitHandler = async (data) => { setIsPending(true); try { const validatedData = ValidationSchema.parse(data); const response = await axios.post( API_URL + "/users/api/v1/auth/login", validatedData ); const expiryTime = watch("remember_me") ? 30 * 24 * 60 * 60 * 1000 : 7 * 24 * 60 * 60 * 1000; setCookie("token", response.data.data.token, { secure: true, sameSite: "none", expires: new Date(Date.now() + expiryTime), }); const userData = await handleGetProfileData(); await dispatch(login(userData)); // 确保 Redux 状态更新完成 router.push("/app"); // 延迟到所有操作完成后 toast.success(response.data.message); } catch (error: any) { // 错误处理逻辑保持不变 } finally { setIsPending(false); }};
2. Firefox 对 sameSite cookie 属性的严格处理
  • 问题:代码中设置了 sameSite: "none",但未同时设置 secure: true(尽管代码中已设置,需确认实际生效)。Firefox 可能因安全策略阻止非安全上下文中的跨站 cookie。
  • 修复

    确保 HTTPS 协议已启用(sameSite: "none" 必须与 secure: true 共用)。

    检查后端是否正确返回 Set-Cookie 头,且域名与前端一致。

3. 未取消的未完成请求导致资源冲突
  • 问题:若用户快速多次提交表单,可能触发多个并发请求,Firefox 可能主动中止旧请求以避免冲突。
  • 修复

    使用取消令牌(AbortController)中止未完成的请求:const onSubmit: SubmitHandler = async (data) => { const controller = new AbortController(); setIsPending(true); try { const validatedData = ValidationSchema.parse(data); const response = await axios.post( API_URL + "/users/api/v1/auth/login", validatedData, { signal: controller.signal } ); // 其余逻辑... } catch (error) { if (axios.isCancel(error)) { console.log("请求已取消", error); } else { // 其他错误处理 } } finally { setIsPending(false); controller.abort(); // 清理 }};

    在组件卸载时取消所有未完成请求(通过 useEffect 清理函数)。

4. React Router 或 Redux 状态更新问题
  • 问题:router.push 或 dispatch(login(userData)) 可能因状态更新冲突导致导航失败。
  • 修复

    确保 login action 是异步的(如 Redux Thunk),并等待其完成:const loginUser = (userData) => async (dispatch) => { dispatch({ type: "LOGIN_START" }); try { // 模拟异步操作(如 API 调用) await new Promise(resolve => setTimeout(resolve, 100)); dispatch({ type: "LOGIN_SUCCESS", payload: userData }); } catch (error) { dispatch({ type: "LOGIN_FAILURE", error }); }};// 调用时await dispatch(loginUser(userData));

    检查 Redux DevTools 确认状态更新无错误。

5. Firefox 扩展或缓存干扰
  • 问题:某些 Firefox 扩展(如广告拦截器)可能干扰请求或导航。
  • 修复

    在无痕模式下测试,或禁用扩展逐一排查。

    清除浏览器缓存和 Cookie 后重试。

6. 代码语法错误(需修正)
  • 问题:代码中存在多处语法错误(如 等待 应为 await、错误:任意 应为 error: any、已验证数据 应为 validatedData),可能导致执行异常。
  • 修复:修正所有语法错误(参考修正后的代码片段)。
最终建议步骤
  1. 优先修复语法错误,确保代码能正常运行。
  2. 添加 async/await 确保异步操作顺序执行。
  3. 测试取消令牌 避免并发请求冲突。
  4. 检查 HTTPS 和 Cookie 设置,确保符合 Firefox 要求。
  5. 在无痕模式下测试,排除扩展干扰。

若问题仍未解决,建议提供 Firefox 控制台完整的错误堆栈(包括网络请求详情)以进一步分析。