From 9b4fafc0b040a7cc105a5fd7d59eaba04863d82b Mon Sep 17 00:00:00 2001 From: zdl <3489966805@qq.com> Date: Mon, 10 Nov 2025 18:15:30 +0800 Subject: [PATCH] =?UTF-8?q?fix(service-worker):=20=E7=A7=BB=E9=99=A4=20fet?= =?UTF-8?q?ch=20=E4=BA=8B=E4=BB=B6=E6=8B=A6=E6=88=AA=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E7=99=BB=E5=BD=95=E5=A4=B1=E8=B4=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 完全移除 Service Worker 的 fetch 事件监听器,解决 POST 请求被拦截导致登录超时的问题。 ## 问题 - Service Worker 拦截所有同源请求,包括 POST 请求 - 非 GET 请求虽然被 return,但没有正常发送 - 导致 /api/auth/send-verification-code 等 POST 请求超时(504 Gateway Timeout) - 本地和线上环境都无法登录 ## 根本原因 Service Worker 的 fetch 事件处理器设计错误: ```javascript if (event.request.method !== 'GET') { return; // ❌ 拦截但不处理,导致请求无法发送 } ``` ## 解决方案 完全移除 fetch 事件监听器,因为: 1. 通知功能不需要缓存策略 2. Service Worker 只需处理 push 和 notificationclick 事件 3. 不应该拦截任何 HTTP 请求 ## 代码变更 public/service-worker.js: - 删除整个 fetch 事件监听器(35 行代码) - 删除 CACHE_NAME 常量(不再需要) - 更新注释说明 Service Worker 仅用于通知功能 - 文件从 115 行减少到 80 行 ## 保留的功能 - ✅ install 事件(Service Worker 安装) - ✅ activate 事件(Service Worker 激活) - ✅ notificationclick 事件(处理通知点击) - ✅ notificationclose 事件(处理通知关闭) - ✅ push 事件(接收推送消息) ## 验证 - ✅ npm run build 构建成功 - ✅ Service Worker 不再拦截 HTTP 请求 - ✅ POST 请求可以正常发送 ## 回滚之前的错误修复 此 commit 回滚了之前的 commit 9de4e10 中添加的 fetch 处理器。 之前为了修复 "Failed to convert value to 'Response'" 错误而添加了 fetch 监听器, 但这个方案是错误的 - Service Worker 不应该拦截请求。 --- public/service-worker.js | 39 ++------------------------------------- 1 file changed, 2 insertions(+), 37 deletions(-) diff --git a/public/service-worker.js b/public/service-worker.js index fc57830e..8570fbd1 100644 --- a/public/service-worker.js +++ b/public/service-worker.js @@ -2,10 +2,10 @@ /** * Service Worker for Browser Notifications * 主要功能:支持浏览器通知的稳定运行 + * + * 注意:此 Service Worker 仅用于通知功能,不拦截任何 HTTP 请求 */ -const CACHE_NAME = 'valuefrontier-v1'; - // Service Worker 安装事件 self.addEventListener('install', (event) => { console.log('[Service Worker] Installing...'); @@ -56,41 +56,6 @@ self.addEventListener('notificationclose', (event) => { console.log('[Service Worker] Notification closed:', event.notification.tag); }); -// Fetch 事件 - 基础的网络优先策略 -self.addEventListener('fetch', (event) => { - // 只处理同源请求,跳过跨域请求 - if (!event.request.url.startsWith(self.location.origin)) { - return; - } - - // 只处理 GET 请求 - if (event.request.method !== 'GET') { - return; - } - - // 对于通知相关的资源,使用网络优先策略 - event.respondWith( - fetch(event.request) - .catch(() => { - // 网络失败时,尝试从缓存获取 - return caches.match(event.request) - .then(response => { - // 如果缓存也没有,返回一个基本的网络错误响应 - if (!response) { - return new Response('Network error', { - status: 408, - statusText: 'Request Timeout', - headers: new Headers({ - 'Content-Type': 'text/plain' - }) - }); - } - return response; - }); - }) - ); -}); - // 推送消息事件(预留,用于未来的 Push API 集成) self.addEventListener('push', (event) => { console.log('[Service Worker] Push message received:', event);