From 623ec73c62db16db8b39dc56807b86a7e35e50d4 Mon Sep 17 00:00:00 2001 From: zdl <3489966805@qq.com> Date: Wed, 5 Nov 2025 16:49:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0mock=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/mocks/browser.js | 2 +- src/mocks/handlers/index.js | 2 + src/mocks/handlers/posthog.js | 85 +++++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 src/mocks/handlers/posthog.js diff --git a/src/mocks/browser.js b/src/mocks/browser.js index f8471a7e..a09ecb1c 100644 --- a/src/mocks/browser.js +++ b/src/mocks/browser.js @@ -34,7 +34,7 @@ export async function startMockServiceWorker() { // 🎯 严格模式(关键配置) // 'bypass': 未定义 Mock 的请求自动转发到真实后端 // 'warn': 未定义的请求会显示警告(调试用) - // 'error': 未定义的请求会抛出错误(严格模式)✅ 当前使用 + // 'error': 未定义的请求会抛出错误(严格模式)✅ 当前使用 穿透模式 bypass onUnhandledRequest: 'error', // 自定义 Service Worker URL(如果需要) diff --git a/src/mocks/handlers/index.js b/src/mocks/handlers/index.js index 233bc60e..530ac1b8 100644 --- a/src/mocks/handlers/index.js +++ b/src/mocks/handlers/index.js @@ -13,6 +13,7 @@ import { companyHandlers } from './company'; import { marketHandlers } from './market'; import { financialHandlers } from './financial'; import { limitAnalyseHandlers } from './limitAnalyse'; +import { posthogHandlers } from './posthog'; // 可以在这里添加更多的 handlers // import { userHandlers } from './user'; @@ -30,5 +31,6 @@ export const handlers = [ ...marketHandlers, ...financialHandlers, ...limitAnalyseHandlers, + ...posthogHandlers, // ...userHandlers, ]; diff --git a/src/mocks/handlers/posthog.js b/src/mocks/handlers/posthog.js new file mode 100644 index 00000000..196fae4e --- /dev/null +++ b/src/mocks/handlers/posthog.js @@ -0,0 +1,85 @@ +// src/mocks/handlers/posthog.js +// PostHog 埋点请求 Mock Handler + +import { http, HttpResponse } from 'msw'; + +/** + * PostHog 埋点 Mock Handler + * 拦截所有发往 PostHog 的埋点请求,避免在 Mock 模式下产生 500 错误 + */ +export const posthogHandlers = [ + // PostHog 事件追踪接口 + http.post('https://us.i.posthog.com/e/', async ({ request }) => { + try { + // 读取埋点数据(可选,用于调试) + const body = await request.text(); + + // 开发环境输出埋点日志(可选,方便调试) + if (process.env.NODE_ENV === 'development' && process.env.REACT_APP_LOG_POSTHOG === 'true') { + console.log('[Mock] PostHog 埋点请求:', { + url: request.url, + bodyPreview: body.substring(0, 150) + (body.length > 150 ? '...' : ''), + }); + } + + // 返回成功响应(模拟 PostHog 服务器响应) + return HttpResponse.json( + { status: 1 }, + { status: 200 } + ); + } catch (error) { + console.error('[Mock] PostHog handler error:', error); + return HttpResponse.json( + { status: 0, error: 'Mock handler error' }, + { status: 500 } + ); + } + }), + + // PostHog batch 批量事件追踪接口(可选) + http.post('https://us.i.posthog.com/batch/', async ({ request }) => { + try { + const body = await request.text(); + + if (process.env.NODE_ENV === 'development' && process.env.REACT_APP_LOG_POSTHOG === 'true') { + console.log('[Mock] PostHog 批量埋点请求:', { + url: request.url, + bodyPreview: body.substring(0, 150) + (body.length > 150 ? '...' : ''), + }); + } + + return HttpResponse.json( + { status: 1 }, + { status: 200 } + ); + } catch (error) { + console.error('[Mock] PostHog batch handler error:', error); + return HttpResponse.json( + { status: 0, error: 'Mock handler error' }, + { status: 500 } + ); + } + }), + + // PostHog decide 接口(功能开关、特性标志) + http.post('https://us.i.posthog.com/decide/', async ({ request }) => { + try { + if (process.env.NODE_ENV === 'development' && process.env.REACT_APP_LOG_POSTHOG === 'true') { + const body = await request.json(); + console.log('[Mock] PostHog decide 请求:', body); + } + + // 返回空的特性标志配置 + return HttpResponse.json({ + featureFlags: {}, + sessionRecording: false, + }); + } catch (error) { + console.error('[Mock] PostHog decide handler error:', error); + return HttpResponse.json( + { featureFlags: {}, sessionRecording: false }, + { status: 200 } + ); + } + }), +];