skybase 0.1.90 → 0.1.93
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.
- package/CHANGELOG.md +23 -0
- package/README.md +53 -44
- package/README_demo9.md +120 -92
- package/lib/middleware/sky-check-param.js +43 -12
- package/package.json +1 -1
- package/screenShot/demo1.png +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,26 @@
|
|
|
1
|
+
## [0.1.92](https://github.com/kongnet/skybase/compare/v0.1.91...v0.1.92) (2022-08-31)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### :ambulance:
|
|
5
|
+
|
|
6
|
+
* 非get/post/all打印出错 ([1573187](https://github.com/kongnet/skybase/commit/157318784828856e7a689c654ce23ba1953f65a5))
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
## [0.1.91](https://github.com/kongnet/skybase/compare/v0.1.90...v0.1.91) (2022-05-16)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### :memo:
|
|
14
|
+
|
|
15
|
+
* 增加RTS例子 ([ed4d52c](https://github.com/kongnet/skybase/commit/ed4d52ceeb04bd8eaba839117588ff90e4c7aac3))
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
## [0.1.90](https://github.com/kongnet/skybase/compare/v0.1.89...v0.1.90) (2022-05-01)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
1
24
|
## [0.1.89](https://github.com/kongnet/skybase/compare/v0.1.88...v0.1.89) (2022-04-29)
|
|
2
25
|
|
|
3
26
|
|
package/README.md
CHANGED
|
@@ -1,39 +1,36 @@
|
|
|
1
1
|
# skybase
|
|
2
|
-

|
|
3
2
|
|
|
4
3
|
Sky web base suit
|
|
5
4
|
|
|
6
5
|
## 安装 Install
|
|
7
6
|
|
|
8
|
-
|
|
9
7
|
npm i skybase
|
|
10
8
|
|
|
11
|
-
|
|
12
|
-
## 开始你的web世界 Hello World
|
|
9
|
+
## 开始你的 web 世界 Hello World
|
|
13
10
|
|
|
14
11
|
const sky = require('skybase')
|
|
15
|
-
|
|
12
|
+
|
|
16
13
|
sky.start({}, async () => {
|
|
17
14
|
console.log('Program running...')
|
|
18
15
|
})
|
|
19
16
|
|
|
20
17
|
## start(config, afterStart)
|
|
21
18
|
|
|
22
|
-
skybase只有一个方法
|
|
19
|
+
skybase 只有一个方法
|
|
23
20
|
|
|
24
|
-
|
|
25
|
-
|
|
21
|
+
- config 配置
|
|
22
|
+
- afterStart 启动成功后执行的方法,可用 async 方法
|
|
26
23
|
|
|
27
24
|
## 配置
|
|
28
25
|
|
|
29
26
|
const path = require('path')
|
|
30
27
|
module.exports = {
|
|
31
|
-
|
|
28
|
+
|
|
32
29
|
/**
|
|
33
30
|
* 项目名称,启动时,会以3D字体的形式在控制台打印
|
|
34
31
|
* */
|
|
35
32
|
name: 'skybase',
|
|
36
|
-
|
|
33
|
+
|
|
37
34
|
/**
|
|
38
35
|
* 中间件
|
|
39
36
|
* ps. 填写中间件的文件名(如果不填文件后缀,则认为是.js),自定义的中间件一定要放在项目根目录的 middleware 文件夹里,不然找不到。
|
|
@@ -60,19 +57,19 @@ skybase只有一个方法
|
|
|
60
57
|
'sky-output',
|
|
61
58
|
'sky-api-register'
|
|
62
59
|
],
|
|
63
|
-
|
|
60
|
+
|
|
64
61
|
/**
|
|
65
62
|
* token 保存key值
|
|
66
63
|
* */
|
|
67
64
|
tokenName: 'skybase',
|
|
68
|
-
|
|
65
|
+
|
|
69
66
|
/**
|
|
70
67
|
* 入口文件的路径
|
|
71
68
|
*
|
|
72
69
|
* 如果不填,或者转为布尔值为false,则使用 path.dirname(process.mainModule.filename) ,即本node应用的入口文件所在目录
|
|
73
70
|
* */
|
|
74
71
|
rootDir: path.dirname(process.mainModule.filename),
|
|
75
|
-
|
|
72
|
+
|
|
76
73
|
/**
|
|
77
74
|
* api定义所在目录
|
|
78
75
|
*
|
|
@@ -81,7 +78,7 @@ skybase只有一个方法
|
|
|
81
78
|
* 填写相对于 rootDir 的相对路径
|
|
82
79
|
* */
|
|
83
80
|
apiDir: './model/api',
|
|
84
|
-
|
|
81
|
+
|
|
85
82
|
/**
|
|
86
83
|
* 控制器所在目录
|
|
87
84
|
*
|
|
@@ -90,7 +87,7 @@ skybase只有一个方法
|
|
|
90
87
|
* 填写相对于 rootDir 的相对路径
|
|
91
88
|
* */
|
|
92
89
|
routerDir: './router',
|
|
93
|
-
|
|
90
|
+
|
|
94
91
|
/**
|
|
95
92
|
* service所在目录
|
|
96
93
|
*
|
|
@@ -100,12 +97,12 @@ skybase只有一个方法
|
|
|
100
97
|
* 填写相对于 rootDir 的相对路径
|
|
101
98
|
* */
|
|
102
99
|
serviceDir: '',
|
|
103
|
-
|
|
100
|
+
|
|
104
101
|
/**
|
|
105
102
|
* 是否打印日志
|
|
106
103
|
* */
|
|
107
104
|
logger: true,
|
|
108
|
-
|
|
105
|
+
|
|
109
106
|
/**
|
|
110
107
|
* 自定义中间件所在目录
|
|
111
108
|
*
|
|
@@ -114,7 +111,7 @@ skybase只有一个方法
|
|
|
114
111
|
* 填写相对于 rootDir 的相对路径
|
|
115
112
|
* */
|
|
116
113
|
middlewareDir: './middleware',
|
|
117
|
-
|
|
114
|
+
|
|
118
115
|
/**
|
|
119
116
|
* 静态服务的路径
|
|
120
117
|
*
|
|
@@ -123,7 +120,7 @@ skybase只有一个方法
|
|
|
123
120
|
* 填写相对于 rootDir 的相对路径
|
|
124
121
|
* */
|
|
125
122
|
staticDir: './www',
|
|
126
|
-
|
|
123
|
+
|
|
127
124
|
/**
|
|
128
125
|
* 限制post来的数据,这个配置将在 sky/middleware/bodyParse.js 中使用
|
|
129
126
|
*/
|
|
@@ -142,21 +139,25 @@ skybase只有一个方法
|
|
|
142
139
|
|
|
143
140
|
## api 定义
|
|
144
141
|
|
|
145
|
-
skybase框架的api定义功能主要有以下几点:
|
|
142
|
+
skybase 框架的 api 定义功能主要有以下几点:
|
|
146
143
|
|
|
147
|
-
1. 指定api所需参数,会自动校验参数是否符合设定
|
|
148
|
-
2. 输出api接口文档,前端同学可直观查看
|
|
144
|
+
1. 指定 api 所需参数,会自动校验参数是否符合设定
|
|
145
|
+
2. 输出 api 接口文档,前端同学可直观查看
|
|
149
146
|
3. 指定接口的访问权限。如是否登录,是否签名,登录者是否拥有指定权限
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
147
|
+
|
|
148
|
+
### param 中的 type 类型说明
|
|
149
|
+
|
|
150
|
+
- int 整形
|
|
151
|
+
- positive/negative 正数/负数
|
|
152
|
+
- string 字符型
|
|
153
|
+
- datetime 可以被 Date.parse 的 'YYYY-MM-DD hh:mm:ss'
|
|
154
|
+
- enum 数组,并要求提交的参数包含在,数组列表中
|
|
155
|
+
- bool bool 型
|
|
156
|
+
- number 数值型
|
|
157
|
+
- array 数组型,用得少,可以为它配置 items 的类型: arrayParam1:{type:'array',items:{type:'string'}}
|
|
158
|
+
|
|
159
159
|
### 案例
|
|
160
|
+
|
|
160
161
|
module.exports = {
|
|
161
162
|
__swagger__: { // 用于把此文件内的接口归为同一组的组名
|
|
162
163
|
name: '文章库-文章管理',
|
|
@@ -197,19 +198,27 @@ skybase框架的api定义功能主要有以下几点:
|
|
|
197
198
|
}
|
|
198
199
|
}
|
|
199
200
|
|
|
201
|
+
**接口地址**:
|
|
200
202
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
* 如果以 / 开始,接口路径则完全等于所编写的地址
|
|
204
|
-
* 否则接口路径的规则为:
|
|
203
|
+
- 如果以 / 开始,接口路径则完全等于所编写的地址
|
|
204
|
+
- 否则接口路径的规则为:
|
|
205
205
|
|
|
206
206
|
## 实操案例
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
207
|
+
|
|
208
|
+
### mock 服务器
|
|
209
|
+
|
|
210
|
+
- 1. 运行 npm run demo5 //启动 mock 服务器,前提需要有 nodemon 全局安装 npm i -g nodemon
|
|
211
|
+
- 2. 启动后 访问 http://127.0.0.1:8888/mock/first
|
|
212
|
+
- 3. mock 定义在 [您的项目]\node_modules\skybase\demo\5-mock-api\model\api\mock.js
|
|
213
|
+
|
|
214
|
+
### mysql 探针
|
|
215
|
+
|
|
216
|
+
- 1. 运行 npm run demo9 //启动 mysql 探针服务器,前提需要有 nodemon 全局安装 npm i -g nodemon
|
|
217
|
+
- 2. 启动后 访问 http://127.0.0.1:13000/skyapi/probe/mysql
|
|
218
|
+

|
|
219
|
+
|
|
220
|
+
### RTS 打点例子
|
|
221
|
+
|
|
222
|
+
> RTS 是时序数据库 https://github.com/kongnet/skyrts
|
|
223
|
+
|
|
224
|
+

|
package/README_demo9.md
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
# 加推全栈开发之mysql数据库探针
|
|
1
|
+
# 加推全栈开发之 mysql 数据库探针
|
|
3
2
|
|
|
4
3
|
## 项目背景
|
|
5
4
|
|
|
@@ -9,109 +8,138 @@
|
|
|
9
8
|
|
|
10
9
|
## 项目实操
|
|
11
10
|
|
|
12
|
-
|
|
11
|
+
- 方式一
|
|
12
|
+
|
|
13
|
+
1. 项目地址 [skybase](https://github.com/kongnet/skybase)
|
|
14
|
+
2. clone 后,安装全局 nodemon,npm i -g nodemon.
|
|
15
|
+
3. 运行 demo9,npm run demo9,启动数据库探针
|
|
16
|
+
4. 最终效果
|
|
17
|
+

|
|
18
|
+
|
|
19
|
+
- 方式二(推荐方式)
|
|
20
|
+
|
|
21
|
+
- 1. 使用 skyjt 安装 skybase,项目地址: [skyjt](https://github.com/kongnet/sky)
|
|
22
|
+
- 2. 安装 npm i -g skyjt
|
|
23
|
+
- 3. 创建新的文件夹,cd 进入,执行
|
|
24
|
+
- 4. dn init -f // 强制初始化
|
|
13
25
|
|
|
14
|
-
|
|
15
|
-
2. clone后,安装全局nodemon,npm i -g nodemon.
|
|
16
|
-
3. 运行demo9,npm run demo9,启动数据库探针
|
|
17
|
-
4. 最终效果
|
|
18
|
-

|
|
19
|
-
- 方式二(推荐方式)
|
|
20
|
-
* 1. 使用skyjt安装skybase,项目地址: [skyjt](https://github.com/kongnet/sky)
|
|
21
|
-
* 2. 安装 npm i -g skyjt
|
|
22
|
-
* 3. 创建新的文件夹,cd 进入,执行
|
|
23
|
-
* 4. jt init -f // 强制初始化
|
|
26
|
+

|
|
24
27
|
|
|
25
|
-
|
|
28
|
+
- 5. cd 进创建的目录,执行 **npm i** or **yarn** or **cnpm i**// 安装依赖包
|
|
29
|
+
- 6. 安装全局 nodemon, npm i -g nodemon.
|
|
30
|
+
- 7. 执行 **nodemon** or **npm start** or **node index**
|
|
31
|
+
- 8. 最终效果同方法一 // 数据库探针需要修改 **./config/config.default.js** 中 **mysql** 的配置
|
|
26
32
|
|
|
27
|
-
|
|
28
|
-
* 6. 安装全局nodemon, npm i -g nodemon.
|
|
29
|
-
* 7. 执行 **nodemon** or **npm start** or **node index**
|
|
30
|
-
* 8. 最终效果同方法一 // 数据库探针需要修改 **./config/config.default.js** 中 **mysql** 的配置
|
|
31
|
-
- 注意
|
|
33
|
+
- 注意
|
|
32
34
|
|
|
33
|
-
|
|
35
|
+
请确认数据库链接正常,且有一定的数据.
|
|
34
36
|
|
|
35
|
-
|
|
37
|
+
推荐使用方法二
|
|
36
38
|
|
|
37
39
|
## 项目运行流程
|
|
38
40
|
|
|
39
41
|
1. 流程图
|
|
40
42
|
|
|
41
|
-
|
|
43
|
+

|
|
42
44
|
|
|
43
45
|
2. 项目结构
|
|
44
46
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
47
|
+
```js
|
|
48
|
+
.
|
|
49
|
+
├── README.md
|
|
50
|
+
├── config // 环境配置
|
|
51
|
+
│ ├── config.default.js // 默认环境数据库配置
|
|
52
|
+
│ ├── config.dev.js // 开发环境数据库配置
|
|
53
|
+
│ ├── config.prod.js // 生产环境数据库配置
|
|
54
|
+
│ ├── config.test.js // 测试环境数据库配置
|
|
55
|
+
│ └── index.js // 环境判断
|
|
56
|
+
├── index.js //项目执行文件
|
|
57
|
+
├── model //API定义 抽象类所处位置
|
|
58
|
+
│ └── api
|
|
59
|
+
│ └── skyapi
|
|
60
|
+
│ └── probe.js
|
|
61
|
+
├── package.json // 项目配置文件
|
|
62
|
+
├── router
|
|
63
|
+
│ └── mysqlProbe.js //路由 渲染数据库数据渲染到模版
|
|
64
|
+
├── service
|
|
65
|
+
│ └── mysqlProbe.js //服务 提供处理数据库实际方法
|
|
66
|
+
├── template
|
|
67
|
+
└── treemap-mysql.html // 输出模板
|
|
68
|
+
```
|
|
67
69
|
|
|
68
70
|
3. 方法亮点详解
|
|
69
71
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
72
|
+
- service/mysqlProbe.js
|
|
73
|
+
|
|
74
|
+
```js
|
|
75
|
+
async function getTableColumnSize () {
|
|
76
|
+
let sql = `select
|
|
77
|
+
table_schema as 'dbName',
|
|
78
|
+
table_name as 'tableName',
|
|
79
|
+
table_rows as 'rowCount',
|
|
80
|
+
truncate(data_length/1024/1024, 2) as 'dataSize',
|
|
81
|
+
truncate(index_length/1024/1024, 2) as 'idxSize',
|
|
82
|
+
table_comment as 'tableComment'
|
|
83
|
+
from information_schema.tables
|
|
84
|
+
order by data_length desc, index_length desc;` // 数据库查询语句
|
|
85
|
+
let r = await db.cmd(sql).run() // 异步执行,返回所有数据表的数据
|
|
86
|
+
let arr = []
|
|
87
|
+
let arrSize = []
|
|
88
|
+
let obj = {}
|
|
89
|
+
r.forEach(item => {
|
|
90
|
+
if (obj[item.dbName]) {
|
|
91
|
+
// 如果存在节点就插入到children
|
|
92
|
+
arr[obj[item.dbName]].children.push({
|
|
93
|
+
name:
|
|
94
|
+
item.tableComment +
|
|
95
|
+
'\n' +
|
|
96
|
+
item.tableName +
|
|
97
|
+
'\n\n' +
|
|
98
|
+
(item.rowCount + '').toMoney(2),
|
|
99
|
+
value: item.rowCount || 0
|
|
100
|
+
})
|
|
101
|
+
arrSize[obj[item.dbName]].children.push({
|
|
102
|
+
name:
|
|
103
|
+
item.tableComment +
|
|
104
|
+
'\n' +
|
|
105
|
+
item.tableName +
|
|
106
|
+
'\n\n' +
|
|
107
|
+
(item.dataSize + '').toMoney(2),
|
|
108
|
+
value: item.dataSize || 0
|
|
109
|
+
})
|
|
110
|
+
} else {
|
|
111
|
+
// 如果不存在节点就创建
|
|
112
|
+
if (
|
|
113
|
+
![
|
|
114
|
+
'performance_schema',
|
|
115
|
+
'mysql',
|
|
116
|
+
'information_schema',
|
|
117
|
+
'sys',
|
|
118
|
+
'happyminer_test'
|
|
119
|
+
].includes(item.dbName)
|
|
120
|
+
) {
|
|
121
|
+
// 需要忽略的数据库
|
|
122
|
+
// es7方法: includes
|
|
123
|
+
// 如 [1, 2, 3].includes(2); // true
|
|
124
|
+
// 在es7之前使用indexOf来判断数组中是否包含某个值。
|
|
125
|
+
// 如果不确定是否支持,使用一下方法判断
|
|
126
|
+
// const isInList = (() => {
|
|
127
|
+
// Array.prototype.includes
|
|
128
|
+
// ? (arr, value) => arr.includes(value)
|
|
129
|
+
// : (arr, value) => arr.some(el => el === value)
|
|
130
|
+
// )();
|
|
131
|
+
//})
|
|
132
|
+
arr.push({ name: item.dbName, children: [] })
|
|
133
|
+
arrSize.push({ name: item.dbName, children: [] })
|
|
134
|
+
obj[item.dbName] = arr.length - 1
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
})
|
|
138
|
+
arr.shift() // 因为增加了两条一样的初始数据,所以删除第一条。
|
|
139
|
+
// console.log(arr)
|
|
140
|
+
return {
|
|
141
|
+
code: 0,
|
|
142
|
+
data: { tableRow: arr, tableSize: arrSize }
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
```
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* */
|
|
4
4
|
|
|
5
5
|
const $ = require('meeko')
|
|
6
|
-
const $G = global.$G = global.$G || {}
|
|
7
|
-
const api = $G.api = $G.api || {}
|
|
6
|
+
const $G = (global.$G = global.$G || {})
|
|
7
|
+
const api = ($G.api = $G.api || {})
|
|
8
8
|
|
|
9
9
|
const config = require('../../skyconfig')
|
|
10
10
|
|
|
@@ -12,9 +12,21 @@ const apiCheckLog = function (url, obj, method, oldParam, ctx) {
|
|
|
12
12
|
if (config.logger) {
|
|
13
13
|
let checkColor = 'c'
|
|
14
14
|
obj = obj || {}
|
|
15
|
-
if (obj.code >= 400) {
|
|
15
|
+
if (obj.code >= 400) {
|
|
16
|
+
checkColor = 'y'
|
|
17
|
+
}
|
|
16
18
|
let methodStr = method.toUpperCase()
|
|
17
|
-
|
|
19
|
+
const fname =
|
|
20
|
+
methodStr === 'GET' ? 'dimg' : methodStr === 'POST' ? 'dimy' : 'r'
|
|
21
|
+
$.log(
|
|
22
|
+
$.c[fname](`[ ${methodStr} ]`) +
|
|
23
|
+
$.c.dimy(url.join ? url.join('/') : url) +
|
|
24
|
+
$.c[checkColor](JSON.stringify(obj || '{}')),
|
|
25
|
+
'实际参数:',
|
|
26
|
+
oldParam ? $.c.r(JSON.stringify(oldParam || '{}')) : '',
|
|
27
|
+
'header参数:',
|
|
28
|
+
$.c.c(JSON.stringify(ctx.header || '{}'))
|
|
29
|
+
)
|
|
18
30
|
}
|
|
19
31
|
}
|
|
20
32
|
|
|
@@ -22,7 +34,8 @@ const apiCheckLog = function (url, obj, method, oldParam, ctx) {
|
|
|
22
34
|
const checkRedirect = (ctx, apiPath) => {
|
|
23
35
|
if (config.redirect) {
|
|
24
36
|
let url = config.redirect[apiPath] || null
|
|
25
|
-
if (url) {
|
|
37
|
+
if (url) {
|
|
38
|
+
// 跳转
|
|
26
39
|
if (ctx.request.header) {
|
|
27
40
|
url = `${ctx.request.header['x-forwarded-prefix'] || ''}${url}`
|
|
28
41
|
}
|
|
@@ -48,7 +61,7 @@ const checkCache = (ctx, method, url) => {
|
|
|
48
61
|
// 快速检查是否可以不执行具体方法
|
|
49
62
|
const preCheck = (ctx, method, url, apiPath) => {
|
|
50
63
|
if (!['get', 'post'].includes(method)) {
|
|
51
|
-
ctx.throwCode(ctx.status, '只支持get/post方式')
|
|
64
|
+
ctx.throwCode(ctx.status, '只支持get/post/all方式')
|
|
52
65
|
return { succ: false, continue: false }
|
|
53
66
|
}
|
|
54
67
|
if (checkRedirect(ctx, apiPath)) {
|
|
@@ -64,8 +77,16 @@ const preCheck = (ctx, method, url, apiPath) => {
|
|
|
64
77
|
let apiSetting = api[apiPath]
|
|
65
78
|
//NOTICE: 支持动态路由,但找不到的时候性能有点损失
|
|
66
79
|
if (!apiSetting) {
|
|
67
|
-
apiSetting =
|
|
68
|
-
|
|
80
|
+
apiSetting =
|
|
81
|
+
api[
|
|
82
|
+
Object.keys(api).find(
|
|
83
|
+
x =>
|
|
84
|
+
x.includes(':') &&
|
|
85
|
+
new RegExp(x.replace(/(:[0-9a-z]+)/g, '[0-9a-z]+'), 'g').test(
|
|
86
|
+
apiPath
|
|
87
|
+
)
|
|
88
|
+
)
|
|
89
|
+
]
|
|
69
90
|
}
|
|
70
91
|
if (!apiSetting) {
|
|
71
92
|
ctx.throwCode(404, '接口不存在')
|
|
@@ -73,7 +94,8 @@ const preCheck = (ctx, method, url, apiPath) => {
|
|
|
73
94
|
}
|
|
74
95
|
|
|
75
96
|
const needMethod = apiSetting.method
|
|
76
|
-
if (method !== needMethod && needMethod !== 'all') {
|
|
97
|
+
if (method !== needMethod && needMethod !== 'all') {
|
|
98
|
+
// 允许get和post都接入
|
|
77
99
|
$.err(`方法类型不对,应为${needMethod},不能为${method}`)
|
|
78
100
|
ctx.throwCode(405, '方法类型不对')
|
|
79
101
|
return { succ: false, continue: false }
|
|
@@ -86,7 +108,12 @@ module.exports = async (ctx, next) => {
|
|
|
86
108
|
const method = ctx.method.toLowerCase()
|
|
87
109
|
const url = ctx.request.url
|
|
88
110
|
const apiPath = url.split('?')[0]
|
|
89
|
-
const { continue: canContinue, succ, needMethod, apiSetting } = preCheck(
|
|
111
|
+
const { continue: canContinue, succ, needMethod, apiSetting } = preCheck(
|
|
112
|
+
ctx,
|
|
113
|
+
method,
|
|
114
|
+
url,
|
|
115
|
+
apiPath
|
|
116
|
+
)
|
|
90
117
|
if (!canContinue) {
|
|
91
118
|
apiCheckLog(apiPath, ctx.body, method, null, ctx)
|
|
92
119
|
return succ ? 1 : 0
|
|
@@ -94,7 +121,8 @@ module.exports = async (ctx, next) => {
|
|
|
94
121
|
|
|
95
122
|
ctx.apiSetting = apiSetting
|
|
96
123
|
|
|
97
|
-
const params =
|
|
124
|
+
const params =
|
|
125
|
+
method === 'get' ? ctx.query || {} : ctx.request.fields || ctx.body || {}
|
|
98
126
|
|
|
99
127
|
// 下面是原来有的逻辑,感觉不安全,所以去掉了
|
|
100
128
|
// NOTICE 如果是上传文件不过滤参数 参数里有files的即为上传
|
|
@@ -106,7 +134,10 @@ module.exports = async (ctx, next) => {
|
|
|
106
134
|
// }
|
|
107
135
|
// }
|
|
108
136
|
|
|
109
|
-
ctx.checkedData = $.tools.checkParam(
|
|
137
|
+
ctx.checkedData = $.tools.checkParam(
|
|
138
|
+
params,
|
|
139
|
+
(needMethod === 'all' && apiSetting.param[method]) || apiSetting.param
|
|
140
|
+
)
|
|
110
141
|
apiCheckLog(apiPath, ctx.checkedData, method, params, ctx)
|
|
111
142
|
if (ctx.checkedData.code >= 400) {
|
|
112
143
|
return ctx.throwCode(400, ctx.checkedData.msg)
|
package/package.json
CHANGED
|
Binary file
|