@x-9lab/xlab 1.1.0 → 1.2.1-alpha.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.
@@ -0,0 +1,3 @@
1
+ import type Fetch from "node-fetch";
2
+ declare function getFetch(): Promise<typeof Fetch>;
3
+ export { getFetch };
package/README.md CHANGED
@@ -64,6 +64,11 @@ X-9lab 通用服务端
64
64
  - `method` 接口类型,如 `get` 或 `post`
65
65
  - `middleware` 接口中间件
66
66
  - `handler` 接口处理函数
67
+ - 特殊文件夹
68
+ - 以 `@` 开头的文件夹, 该文件夹不会被当成接口文件夹,但可在正常的接口中作为普通模块使用
69
+ - 以 `$` 开头的文件夹, 该文件夹中的文件会成为后续接口的通用中间件,可以用于某类型业务的统一处理,如后台某些接口的额外身份处理。为了防止滥用,该文件夹不会递归查找,也就是说不支持子文件夹的组织形式。
70
+ - 整个 api 地址的每个父层都可以有独立的中间件文件,执行顺序会按照目录层级执行
71
+ - 中间件文件夹内的文件只会按照文件名做简单排序,因此请特别注意执行顺序是否符合自己的预期,或采用带序号的文件名
67
72
  - 自定义逻辑,存放于 `custom` 目录,模块需要导出一个函数作为执行入口
68
73
  - 中间件,存放于 `middleware` 目录
69
74
  - 定时任务,存放于 `cron` 目录
@@ -16,9 +16,9 @@ _export(exports, {
16
16
  post: ()=>requestPost
17
17
  });
18
18
  const _utils = require("@x-drive/utils");
19
+ const _nodeFetchWarper = require("@x-drive/node-fetch-warper");
19
20
  const _resolveUri = /*#__PURE__*/ _interopRequireDefault(require("./resolve-uri"));
20
21
  const _common = require("../common");
21
- const _nodeFetch = /*#__PURE__*/ _interopRequireDefault(require("node-fetch"));
22
22
  function _interopRequireDefault(obj) {
23
23
  return obj && obj.__esModule ? obj : {
24
24
  default: obj
@@ -109,7 +109,8 @@ const DEF_CONFIG = {
109
109
  if (data) {
110
110
  options.body = data;
111
111
  }
112
- const resp = await (0, _nodeFetch.default)(url, options);
112
+ const fetch = await (0, _nodeFetchWarper.getFetch)();
113
+ const resp = await fetch(url, options);
113
114
  if (resp) {
114
115
  if ((0, _utils.isExecutable)(config.onResponse)) {
115
116
  await config.onResponse(resp);
package/dist/router.js CHANGED
@@ -10,6 +10,7 @@ const _utils = require("@x-drive/utils");
10
10
  const _common = require("./components/common");
11
11
  const _defaultXConfig = /*#__PURE__*/ _interopRequireDefault(require("./default-x-config"));
12
12
  const _path = /*#__PURE__*/ _interopRequireDefault(require("path"));
13
+ const _fs = /*#__PURE__*/ _interopRequireDefault(require("fs"));
13
14
  function _interopRequireDefault(obj) {
14
15
  return obj && obj.__esModule ? obj : {
15
16
  default: obj
@@ -21,9 +22,41 @@ function _interopRequireDefault(obj) {
21
22
  }
22
23
  return `/api${api}`;
23
24
  }
25
+ /**
26
+ * 递归处理文件夹
27
+ * @param path 文件目录
28
+ * @param middlewares 接口中间件
29
+ * @param callback 查找到文件时的处理函数
30
+ */ function walk(dir, middlewares, callback) {
31
+ var files = _fs.default.readdirSync(dir);
32
+ files.forEach(function(item) {
33
+ if (!item.startsWith(".") && !item.endsWith(".d.ts")) {
34
+ var tmpPath = _path.default.join(dir, item);
35
+ var stats = _fs.default.statSync(tmpPath);
36
+ if (stats.isDirectory() && item.startsWith("$")) {
37
+ // 接口级别中间件
38
+ let middlewaresFiles = _fs.default.readdirSync(tmpPath);
39
+ middlewaresFiles.forEach(function(name) {
40
+ let tmpMwPath = _path.default.join(tmpPath, name);
41
+ let fileStat = _fs.default.statSync(tmpMwPath);
42
+ if (!fileStat.isDirectory() && !item.startsWith(".") && !item.endsWith(".d.ts")) {
43
+ middlewares.push(tmpMwPath);
44
+ }
45
+ });
46
+ // 简单做下排序
47
+ middlewares.sort();
48
+ }
49
+ if (stats.isDirectory() && !item.startsWith("@") && !item.startsWith("$")) {
50
+ walk(tmpPath, middlewares, callback);
51
+ } else if (!stats.isDirectory()) {
52
+ callback(tmpPath, item, middlewares);
53
+ }
54
+ }
55
+ });
56
+ }
24
57
  /**加载业务服务接口 */ function appRouter(router) {
25
58
  const IS_API_REGEXP = /^\/api\//;
26
- var processBusiness = function(modPath, item) {
59
+ var processBusiness = function(modPath, item, middlewares) {
27
60
  var mod = require(_path.default.resolve(modPath));
28
61
  if (mod) {
29
62
  mod = (0, _common.getRealDefaultMod)(mod);
@@ -84,17 +117,26 @@ function _interopRequireDefault(obj) {
84
117
  modName = "get";
85
118
  }
86
119
  }
120
+ if (middlewares && middlewares.length) {
121
+ let mws = middlewares.map((name)=>(0, _common.getRealDefaultMod)(require(name)));
122
+ mod.splice.apply(mod, [
123
+ 1,
124
+ 0,
125
+ ...mws
126
+ ]);
127
+ mws = null;
128
+ }
87
129
  router[modName].apply(router, mod);
88
130
  masterLog("router", `Handling API >>> [${modName}] ${api}`);
89
131
  }
90
132
  };
91
133
  // 业务基本目录
92
134
  var _p = _path.default.resolve(__dirname, "business");
93
- (0, _common.walk)(_p, 0, processBusiness);
135
+ walk(_p, [], processBusiness);
94
136
  // 支持自定义 api
95
137
  _p = _path.default.resolve(process.cwd(), _defaultXConfig.default.businessDir, "business");
96
138
  if (process.cwd() !== __dirname && (0, _common.checkFileStat)(_p)) {
97
- (0, _common.walk)(_p, 0, processBusiness);
139
+ walk(_p, [], processBusiness);
98
140
  }
99
141
  processBusiness = null;
100
142
  console.log("");
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@x-9lab/xlab",
3
- "version": "1.1.0",
3
+ "version": "1.2.1-alpha.1",
4
4
  "description": "9lab 服务端模块",
5
- "versionDesc": "originHost 现在所有请求都会带上",
5
+ "versionDesc": "业务 api 文件夹支持接口级别通用中间件定义",
6
6
  "scripts": {
7
7
  "dev": "swc src -D ./src/bin --config-file .swcrc -d dist -w",
8
8
  "compile": "swc src -D ./src/bin --config-file .swcrc -d dist",
@@ -33,7 +33,8 @@
33
33
  "koa-router": "11.0.1",
34
34
  "http-proxy": "1.18.1",
35
35
  "koa-compress": "5.1.0",
36
- "@x-drive/utils": "1.1.23"
36
+ "@x-drive/utils": "1.1.23",
37
+ "@x-drive/node-fetch-warper": "1.0.0"
37
38
  },
38
39
  "devDependencies": {
39
40
  "co": "4.6.0",