sw.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /**
  2. * FeHelper Postman Mock Server
  3. * 基于Service Worker实现的本地POST请求模拟服务器
  4. */
  5. // 模拟的API端点配置
  6. const MOCK_APIS = {
  7. '/api/mock': {
  8. method: 'POST',
  9. response: {
  10. success: true,
  11. message: 'Mock服务器响应成功',
  12. timestamp: new Date().toISOString(),
  13. data: {
  14. id: 1001,
  15. name: 'FeHelper Mock API',
  16. version: '1.0.0',
  17. description: '这是一个基于Service Worker的模拟API服务器'
  18. }
  19. },
  20. delay: 500 // 模拟网络延迟
  21. },
  22. '/api/user/login': {
  23. method: 'POST',
  24. response: {
  25. success: true,
  26. message: '登录成功',
  27. token: 'mock_jwt_token_' + Date.now(),
  28. user: {
  29. id: 1001,
  30. username: 'testuser',
  31. email: '[email protected]',
  32. role: 'admin'
  33. }
  34. },
  35. delay: 300
  36. },
  37. '/api/data/create': {
  38. method: 'POST',
  39. response: {
  40. success: true,
  41. message: '数据创建成功',
  42. id: Math.floor(Math.random() * 10000),
  43. createdAt: new Date().toISOString()
  44. },
  45. delay: 800
  46. }
  47. };
  48. // 监听fetch事件
  49. self.addEventListener('fetch', (event) => {
  50. const url = new URL(event.request.url);
  51. const pathname = url.pathname;
  52. // 检查是否是我们的Mock API端点
  53. const mockApi = MOCK_APIS[pathname];
  54. if (mockApi && event.request.method === mockApi.method) {
  55. event.respondWith(handleMockRequest(event.request, mockApi));
  56. }
  57. });
  58. // 处理Mock请求
  59. async function handleMockRequest(request, mockApi) {
  60. try {
  61. // 模拟网络延迟
  62. await new Promise(resolve => setTimeout(resolve, mockApi.delay));
  63. // 获取请求体数据
  64. let requestData = null;
  65. try {
  66. const contentType = request.headers.get('content-type');
  67. if (contentType && contentType.includes('application/json')) {
  68. requestData = await request.json();
  69. } else if (contentType && contentType.includes('application/x-www-form-urlencoded')) {
  70. const formData = await request.text();
  71. requestData = parseFormData(formData);
  72. }
  73. } catch (e) {
  74. console.log('Mock Server: 无法解析请求体', e);
  75. }
  76. // 构建响应数据
  77. const responseData = {
  78. ...mockApi.response,
  79. request: {
  80. method: request.method,
  81. url: request.url,
  82. headers: Object.fromEntries(request.headers.entries()),
  83. body: requestData
  84. },
  85. server: {
  86. name: 'FeHelper Mock Server',
  87. version: '1.0.0',
  88. poweredBy: 'Service Worker'
  89. }
  90. };
  91. // 返回响应
  92. return new Response(JSON.stringify(responseData, null, 2), {
  93. status: 200,
  94. statusText: 'OK',
  95. headers: {
  96. 'Content-Type': 'application/json; charset=utf-8',
  97. 'Access-Control-Allow-Origin': '*',
  98. 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
  99. 'Access-Control-Allow-Headers': 'Content-Type, Authorization',
  100. 'X-Powered-By': 'FeHelper Mock Server',
  101. 'X-Response-Time': mockApi.delay + 'ms'
  102. }
  103. });
  104. } catch (error) {
  105. // 错误响应
  106. return new Response(JSON.stringify({
  107. success: false,
  108. error: 'Mock服务器内部错误',
  109. message: error.message,
  110. timestamp: new Date().toISOString()
  111. }, null, 2), {
  112. status: 500,
  113. statusText: 'Internal Server Error',
  114. headers: {
  115. 'Content-Type': 'application/json; charset=utf-8'
  116. }
  117. });
  118. }
  119. }
  120. // 解析表单数据
  121. function parseFormData(formDataString) {
  122. const params = new URLSearchParams(formDataString);
  123. const result = {};
  124. for (const [key, value] of params) {
  125. result[key] = value;
  126. }
  127. return result;
  128. }
  129. // Service Worker安装事件
  130. self.addEventListener('install', (event) => {
  131. console.log('FeHelper Mock Server: Service Worker 已安装');
  132. self.skipWaiting();
  133. });
  134. // Service Worker激活事件
  135. self.addEventListener('activate', (event) => {
  136. console.log('FeHelper Mock Server: Service Worker 已激活');
  137. event.waitUntil(self.clients.claim());
  138. });
  139. console.log('FeHelper Mock Server: Service Worker 已加载');