abler-api 0.1.14 → 0.1.17

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/dist/cjs/pp-util.js +199 -24
  2. package/package.json +3 -2
@@ -3,12 +3,14 @@
3
3
  var require$$0 = require('crypto');
4
4
  var require$$1 = require('abler-util');
5
5
  var require$$2 = require('abler-db');
6
+ var require$$3 = require('abler-net');
6
7
 
7
8
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
8
9
 
9
10
  var require$$0__default = /*#__PURE__*/_interopDefaultLegacy(require$$0);
10
11
  var require$$1__default = /*#__PURE__*/_interopDefaultLegacy(require$$1);
11
12
  var require$$2__default = /*#__PURE__*/_interopDefaultLegacy(require$$2);
13
+ var require$$3__default = /*#__PURE__*/_interopDefaultLegacy(require$$3);
12
14
 
13
15
  const crypto = require$$0__default["default"];
14
16
  const ppUtil$1 = require$$1__default["default"].ppUtil;
@@ -16,6 +18,7 @@ const {
16
18
  dbUtil,
17
19
  kvStorage
18
20
  } = require$$2__default["default"];
21
+ const netUtil = require$$3__default["default"];
19
22
  let conf, appSetting, err, dbSql;
20
23
  const pnToken = "access_token",
21
24
  hnToken = pnToken,
@@ -74,26 +77,6 @@ class apiUtil$1 {
74
77
  } //#endregion
75
78
  //#region ===== API服务相关工具
76
79
 
77
- /**
78
- * 获取客户端IP地址
79
- * @param req
80
- * @returns {*|string|string}
81
- */
82
-
83
-
84
- static getClientIp(req) {
85
- let ip = req.headers["x-real-ip"] || req.headers["x-true-ip"] || req.headers['x-forwarded-for'] || req.headers['x-forward-for'] || req.connection.remoteAddress || req.socket.remoteAddress || req.headers['host'] || ""; // console.log("Request IP:", ip, "req: ", req);
86
-
87
- if (ip.indexOf(",") >= 0) {
88
- ip = ip.split(',')[0];
89
- }
90
-
91
- if (ip.indexOf(":") >= 0) {
92
- ip = ip.substring(ip.lastIndexOf(':') + 1);
93
- }
94
-
95
- return ip;
96
- }
97
80
  /**
98
81
  * 从请求中解出数据,包括路径参数、查询参数和Body
99
82
  * @param req
@@ -532,7 +515,7 @@ class apiUtil$1 {
532
515
  req.accessToken = req.accessToken || apiUtil$1.extractToken(req);
533
516
  const tokenKey = apiUtil$1.userTokenStoreKey(req.accessToken);
534
517
  const expireTime = apiUtil$1.tokenExpireTime(req);
535
- await apiUtil$1.restoreTokenData(tokenKey, expireTime).then(async function (data) {
518
+ return await apiUtil$1.restoreTokenData(tokenKey, expireTime).then(async function (data) {
536
519
  req.userInfo = apiUtil$1.setUserIdNo(data, data._idNo);
537
520
  if (req.tokenValidater) await req.tokenValidater(req.userInfo, req);
538
521
  return true;
@@ -1038,6 +1021,148 @@ class apiUtil$1 {
1038
1021
  }
1039
1022
 
1040
1023
  return Promise.resolve(paramSufix);
1024
+ }
1025
+ /**
1026
+ * 获取客户端IP地址
1027
+ * @param req
1028
+ * @returns {*|string|string}
1029
+ */
1030
+
1031
+
1032
+ static getClientIp(req) {
1033
+ let ip = req.headers["x-real-ip"] || req.headers["x-true-ip"] || req.headers['x-forwarded-for'] || req.headers['x-forward-for'] || req.connection.remoteAddress || req.socket.remoteAddress || req.headers['host'] || ""; // console.log("Request IP:", ip, "req: ", req);
1034
+
1035
+ if (ip.indexOf(",") >= 0) {
1036
+ ip = ip.split(',')[0];
1037
+ }
1038
+
1039
+ if (ip.indexOf(":") >= 0) {
1040
+ ip = ip.substring(ip.lastIndexOf(':') + 1);
1041
+ }
1042
+
1043
+ return ip;
1044
+ }
1045
+ /**
1046
+ * 获取与本机一起提供服务的所有主机
1047
+ * @param params
1048
+ * @returns {{port: (number|number), hosts: [string]}}
1049
+ */
1050
+
1051
+
1052
+ static getEnvHosts(params) {
1053
+ configNeeded();
1054
+ let envType = ppUtil$1.getEnvType();
1055
+ let x = conf.envHosts[envType] || {
1056
+ hosts: ["localhost"]
1057
+ };
1058
+ let port = +params.port || 8443;
1059
+ return {
1060
+ hosts: x.hosts,
1061
+ port: x.port || port
1062
+ };
1063
+ }
1064
+ /**
1065
+ * 检查指定的host和发送请求的ip是不是自己的ip
1066
+ * @param host
1067
+ * @param req
1068
+ * @returns {Promise<*>}
1069
+ */
1070
+
1071
+
1072
+ static async hostIsMySelf(host, req) {
1073
+ let clientIp = apiUtil$1.getClientIp(req);
1074
+ return getMyIp({
1075
+ hosts: [host, clientIp]
1076
+ });
1077
+ }
1078
+ /**
1079
+ * 检查是否应该把请求转发到其它服务器,若是则转发
1080
+ * @param options
1081
+ * @returns {Promise<boolean>}
1082
+ */
1083
+
1084
+
1085
+ static async checkForwardsHost(options) {
1086
+ configNeeded();
1087
+ const params = options.replacements;
1088
+ const myEnvHosts = apiUtil$1.getEnvHosts(params);
1089
+ const myIp = ppUtil$1.getMyIp();
1090
+ const host = params.host || myIp;
1091
+ if (!myEnvHosts.hosts.contains(host)) throw [err.ACCESS_REFUSED, `环境${conf.envId}貌似无此主机:${params.host}`];
1092
+
1093
+ if (!apiUtil$1.hostIsMySelf(host, options._res.req)) {
1094
+ let result = await apiUtil$1.forwardsTo(host, myEnvHosts.port, params, options._res.req, myIp);
1095
+
1096
+ options._res.send(result);
1097
+
1098
+ return true;
1099
+ }
1100
+
1101
+ return false;
1102
+ }
1103
+ /**
1104
+ * 将收到的请求转发到另一台主机
1105
+ * @param anotherIp
1106
+ * @param port
1107
+ * @param params
1108
+ * @param req
1109
+ * @param lanClient
1110
+ * @returns {Promise<*>}
1111
+ */
1112
+
1113
+
1114
+ static async forwardsTo(anotherIp, port, params, req, lanClient) {
1115
+ let url = anotherIp.indexOf("://") > 0 ? anotherIp : `${port === 443 ? "https" : "http"}://${anotherIp}:${port}${req.originalUrl}`;
1116
+
1117
+ if (url.indexOf("?") > 0) {
1118
+ url = url.substring(0, url.indexOf("?"));
1119
+ }
1120
+
1121
+ let reqOptions = {
1122
+ method: req.method,
1123
+ url: url,
1124
+ data: params
1125
+ };
1126
+ let result = await netUtil.apiRequest(reqOptions);
1127
+
1128
+ if (result.status !== 200) {
1129
+ console.log(`访问 ${reqOptions.url} 出错`, result.status, result.res.statusMessage);
1130
+ throw [err.EXCEPTION, `[${result.status}] - ${result.res.statusMessage}`];
1131
+ }
1132
+
1133
+ return result.data;
1134
+ }
1135
+ /**
1136
+ * 解析配置项路径
1137
+ * @param keyPath
1138
+ * @returns {{parent: null, parentKey: string, value, key: string}}
1139
+ */
1140
+
1141
+
1142
+ static parseCfgPath(keyPath) {
1143
+ let keys = Array.isArray(keyPath) ? keyPath : keyPath.split(".");
1144
+ let parentKey = "";
1145
+ let key = "config";
1146
+ let value = conf;
1147
+ let parent = null;
1148
+
1149
+ for (let i = 0; i < keys.length; i++) {
1150
+ parent = value;
1151
+ parentKey += (parentKey ? "." : "") + key;
1152
+ key = keys[i];
1153
+ value = parent[key];
1154
+
1155
+ if (value === undefined) {
1156
+ throw [err.INVALID_PARAM, `无此配置项: ${key}`];
1157
+ }
1158
+ }
1159
+
1160
+ return {
1161
+ parent,
1162
+ parentKey,
1163
+ key,
1164
+ value
1165
+ };
1041
1166
  } //#endregion
1042
1167
  //region ====中间件
1043
1168
 
@@ -1049,11 +1174,12 @@ class apiUtil$1 {
1049
1174
  static async $checkToken(req, res, next) {
1050
1175
  try {
1051
1176
  await apiUtil$1.checkRequestToken(req);
1052
- return true;
1177
+ await next();
1053
1178
  } catch (e) {
1054
1179
  res.send(err.ERROR(e));
1055
- return false;
1056
1180
  }
1181
+
1182
+ return false;
1057
1183
  }
1058
1184
  /**
1059
1185
  * 检查令牌,若存在则将其用户信息置入req
@@ -1207,7 +1333,7 @@ class apiUtil$1 {
1207
1333
 
1208
1334
  req.isApiCall = true;
1209
1335
  req.tokenData = p;
1210
- apiUtil$1.$checkApiKeyOld(req, res, next);
1336
+ return apiUtil$1.$checkApiKeyOld(req, res, next);
1211
1337
  }).catch(e => {
1212
1338
  apiUtil$1.sendOrRedirect(req, res, apiUtil$1.spoApiFail(err.TOKEN_INVALID, req));
1213
1339
  });
@@ -1244,6 +1370,55 @@ class apiUtil$1 {
1244
1370
  });
1245
1371
  }
1246
1372
  } //#endregion
1373
+ //region ====一些通用服务功能
1374
+
1375
+ /**
1376
+ * 获取配置数据
1377
+ * @param options
1378
+ * @returns {Promise<boolean|*>}
1379
+ */
1380
+ // api/config/appSetting.ossEnabled
1381
+
1382
+
1383
+ static async getConfigValue(options) {
1384
+ configNeeded();
1385
+ const params = options.replacements;
1386
+ let item = params.item;
1387
+ delete params.item;
1388
+ if (await apiUtil$1.checkForwardsHost(options)) return true;
1389
+ let c = apiUtil$1.parseCfgPath(item);
1390
+ delete c.parent;
1391
+ c.host = ppUtil$1.getMyIp();
1392
+ return c;
1393
+ }
1394
+ /**
1395
+ * 设置配置数据
1396
+ * @param options
1397
+ * @returns {Promise<*>}
1398
+ */
1399
+
1400
+
1401
+ static async setConfigValue(options) {
1402
+ configNeeded();
1403
+ const params = options.replacements;
1404
+ let item = params.item;
1405
+ delete params.item; // if (await checkForwardsHost(options))
1406
+ // return true;
1407
+
1408
+ await apiUtil$1.parametersOK(params, "value");
1409
+ let c = apiUtil$1.parseCfgPath(item);
1410
+
1411
+ if (typeof c.value === "object") {
1412
+ throw [err.ACCESS_REFUSED, `暂不支持修改复杂配置`];
1413
+ } // c.oldValue = c.value;
1414
+
1415
+
1416
+ c.newValue = params.value;
1417
+ c.parent[c.key] = c.newValue;
1418
+ delete c.parent;
1419
+ c.host = ppUtil$1.getMyIp();
1420
+ return c; // 应用层自行处理多机同步
1421
+ } //#endregion
1247
1422
 
1248
1423
 
1249
1424
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "abler-api",
3
- "version": "0.1.14",
3
+ "version": "0.1.17",
4
4
  "description": "API服务相关工具",
5
5
  "main": "./dist/cjs/pp-util.js",
6
6
  "-module": "./dist/es/pp-util.js",
@@ -16,7 +16,8 @@
16
16
  "dependencies": {
17
17
  "q": "^1.5.1",
18
18
  "abler-util": ">=0.1.1",
19
- "abler-db": ">=0.1.1"
19
+ "abler-db": ">=0.1.1",
20
+ "abler-net": ">=0.1.1"
20
21
  },
21
22
  "devDependencies": {
22
23
  "@babel/core": "^7.18.5",