mocksw 1.1.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/README.md +58 -26
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # mocksw
2
2
 
3
+ [![npm version](https://img.shields.io/npm/v/mocksw.svg)](https://www.npmjs.com/package/mocksw)
4
+ [![license](https://img.shields.io/github/license/zstings/mocksw.svg)](LICENSE)
5
+
3
6
  一个基于 Service Worker 的轻量级、零侵入 API 模拟工具。通过在 Service Worker 层拦截 fetch 请求,实现在本地开发环境中快速模拟 API 响应。
4
7
 
5
8
  ## ✨ 特性
@@ -20,9 +23,9 @@ npm install mocksw -D
20
23
 
21
24
  ## 🚀 快速开始
22
25
 
23
- ### 1. 初始化
26
+ ### 1. 初始化 Worker 环境
24
27
 
25
- 在你的项目根目录下运行初始化命令(通常是 public 文件夹):
28
+ 在你的项目根目录下运行初始化命令:
26
29
 
27
30
  ```sh
28
31
  npx mocksw init public
@@ -30,16 +33,15 @@ npx mocksw init public
30
33
  pnpm exec mocksw init public
31
34
  ```
32
35
 
33
- 这将在你的公共目录下生成 `swMockWorker.js` worker环境。
36
+ 这将在指定的目录 `public` 下生成 `swMockWorker.js` worker环境。
34
37
 
35
- ### 2. 注册拦截接口
38
+ ### 2. 定义 Mock 接口
36
39
 
37
40
  在你的应用入口文件(如 `main.ts` 或 `index.ts`)中进行配置:
38
41
 
39
42
  ```js
40
43
  import { httpRequest } from 'mocksw';
41
-
42
- // 定义 Mock 接口
44
+ // 定义简单的 Mock 接口
43
45
  httpRequest.post('/api/user/login', async ({ body }, res) => {
44
46
  const { username, password } = body;
45
47
  // 模拟延迟 1000ms
@@ -55,18 +57,10 @@ httpRequest.post('/api/user/login', async ({ body }, res) => {
55
57
  msg: 'success',
56
58
  });
57
59
  });
58
- ```
59
-
60
- ### 3. 在项目入口文件中引入初始化
61
-
62
- 在项目入口文件(如 `main.js`)中引入 Service Worker:
63
-
64
- ```js
65
- // 初始化 Mock 环境 指定域名进行拦截 推荐在 Vue 实例挂载后初始化
66
- httpRequest.init('www.vadmin.test.com').then(() => {
67
- console.log('🚀 完美 Mock 环境已就绪');
68
- // 挂载 Vue 实例 推荐在 init 后挂载
69
- app.mount('#app');
60
+ // 初始化并指定拦截域名
61
+ httpRequest.init('www.api-server.com').then(() => {
62
+ console.log('🚀 Mock 环境已就绪');
63
+ app.mount('#app'); // 建议在 init 成功后挂载应用
70
64
  // 现在这个接口调用会被拦截 并返回模拟响应
71
65
  login();
72
66
  });
@@ -83,8 +77,6 @@ function login() {
83
77
  }
84
78
  ```
85
79
 
86
- 启动项目,即可在浏览器中使用 Mock API。
87
-
88
80
  ## 📖 API 说明
89
81
 
90
82
  `httpRequest`
@@ -113,15 +105,55 @@ function login() {
113
105
  - `delay(ms)`:延迟响应指定毫秒数 支持链式调用
114
106
  - `status(code)`:设置 HTTP 状态码(默认 200)支持链式调用
115
107
 
116
- ## 🛠️ 高阶用法:结合 Dexie 模拟数据库
108
+ ## 🛠️ 结合web数据库模拟真实后端
117
109
 
118
110
  由于拦截器运行在主线程环境,你可以轻松结合 IndexedDB 进行增删改查:
119
111
 
120
112
  ```ts
121
- import Dexie from 'dexie';
122
- httpRequest.get('/api/users', async (req, res) => {
123
- const db = new Dexie('MyDatabase');
124
- const users = await db.table('users').toArray();
125
- return res.json(users);
113
+ // 登录接口
114
+ httpRequest.post('/user/login', async (req, res) => {
115
+ // 获取请求体中的用户名和密码
116
+ const { username, password } = req.body;
117
+ // 从数据库中查询用户
118
+ const user = await db.users.where({ name: username, password: password }).first();
119
+ // 如果用户不存在 则返回错误响应
120
+ if (!user) return res.json({ code: 500, message: '账号或密码不匹配' });
121
+ // 生成 token 并存储到数据库
122
+ const createToken = 'tk_' + Date.now();
123
+ if (user) {
124
+ user.token = createToken;
125
+ await db.users.update(user.id, user);
126
+ await db.tokens.add({ token: createToken });
127
+ // 登录成功后返回 token
128
+ return res.json({ code: 200, data: { token: createToken } });
129
+ }
126
130
  });
131
+ // 获取用户信息接口
132
+ httpRequest.get('/user/getInfo', async (req, res) => {
133
+ const token = getHeadersToken(req);
134
+ if (!token) return res.json({ code: 500, message: '未登录' });
135
+ const tokenInfo = await db.tokens.where({ token: token }).first();
136
+ if (!tokenInfo) return res.json({ code: 500, message: 'token 无效' });
137
+ const user = await db.users.where({ token: token }).first();
138
+ if (!user) return res.json({ code: 500, message: '用户不存在' });
139
+ // 模拟延迟 500ms
140
+ return res.delay(500).json({ code: 200, data: Object.assign({}, user, { token: undefined }) });
141
+ });
142
+ // 登出接口
143
+ httpRequest.post('/user/logout', async (req, res) => {
144
+ const token = getHeadersToken(req);
145
+ if (token) {
146
+ await db.tokens.where({ token }).delete();
147
+ const user = await db.users.where({ token }).first();
148
+ if (!user) return res.json({ code: 500, message: '用户不存在' });
149
+ user.token = '';
150
+ await db.users.update(user.id, user);
151
+ }
152
+ return res.json({ code: 200, message: '登出成功' });
153
+ });
154
+
155
+ function getHeadersToken(req) {
156
+ const authHeader = req.headers['authorization'] || req.headers['Authorization'];
157
+ return authHeader?.replace('Bearer ', '');
158
+ }
127
159
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mocksw",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "author": "@zstings",