apim-tools
Version:
APIM Tools
151 lines (129 loc) • 3.55 kB
JavaScript
/**
* @file 工具方法
* @author sparklewhy@gmail.com
*/
;
/**
* 将 哈希对象 转成数组结构
*
* @param {Object} obj 要转换的数据对象
* @param {string=} keyFieldName 哈希对象的 key 转换后在数组数据项里的域名称,未提供则丢弃该信息
* @return {Array.<Object>}
*/
exports.obj2arr = function (obj, keyFieldName) {
let arr = [];
Object.keys(obj).forEach(key => {
let item = {};
keyFieldName && (item[keyFieldName] = key);
let value = obj[key];
item = Object.assign(item, value);
arr.push(item);
});
return arr;
};
/**
* 查找包含给定属性名的属性值的数组元素索引,没找到,返回 -1
*
* @param {Array.<Object>} arr 要查找的数组
* @param {string} attrName 查找的属性名
* @param {*} value 要满足的属性值
* @return {number}
*/
exports.findByAttribute = function (arr, attrName, value) {
let found = -1;
arr.some((item, index) => {
if (item[attrName] === value) {
found = index;
return true;
}
});
return found;
};
/**
* 格式化给定的字符串
*
* @param {string} tpl 模板字符串
* @param {Object} data 渲染的模板数据
* @return {string}
*/
exports.formatString = function (tpl, data) {
return tpl.replace(/\$\{(.*)\}/g, (match, key) => {
let value = data[key];
if (value == null) {
return '';
}
return value.toString();
});
};
/**
* 判断当前请求是否是页面访问
*
* @param {Object} req 请求对象
* @return {boolean}
*/
exports.isPageVisit = function (req) {
let accept = req.headers.accept;
return accept && /(^|,)text\/html(,|$)/i.test(accept);
};
/**
* 获取本机的 IPv4 地址
*
* @return {string}
*/
exports.getIP = function () {
let ifaces = require('os').networkInterfaces();
let defultAddress = '127.0.0.1';
let ip = defultAddress;
function x(details) {
if (ip === defultAddress && details.family === 'IPv4') {
ip = details.address;
}
}
Object.keys(ifaces).forEach(dev => {
ifaces[dev].forEach(x);
});
return ip;
};
exports.promisify = function (func, context) {
return function (...args) {
context || (context = this);
return new Promise(function (resolve, reject) {
let callback = function (err, ...values) {
if (err) {
reject(err);
}
else {
resolve(values.length > 1 ? values : values[0]);
}
};
func.apply(context, [].concat(args, callback));
});
};
};
exports.normalizeUrl = function (url) {
return url.replace(/\\/g, '/')
.replace(/\/+/g, '/')
.replace(/^(https?:\/)/, '$1/');
};
/**
* 获取闭合元素匹配的正则
*
* @param {string} tag 元素 tag 名称
* @return {RegExp}
*/
exports.getCloseElementRegexp = function (tag) {
let closeElem = '<\\s*\/\\s*' + tag + '\\s*>';
let regexpStr = closeElem + '(?![\\s\\S]*' + closeElem + ')';
return new RegExp(regexpStr, 'i');
};
/**
* 判断当前请求是否是 静态 JS 资源文件
*
* @param {string} method 请求的方法
* @param {string} pathname 请求路径名
* @return {boolean}
*/
exports.isRequestJSFile = function (method, pathname) {
return method === 'get' && /\.js$/i.test(pathname);
};
Object.assign(exports, require('./helper/file'));