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.
- package/dist/cjs/pp-util.js +199 -24
- package/package.json +3 -2
package/dist/cjs/pp-util.js
CHANGED
|
@@ -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
|
-
|
|
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.
|
|
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",
|