nodejs自己在项目中使用的一个工具库utils.js文件
文件内容如下:
/**
* utils.js
*/
var crypto = require('crypto');
var url = require('url');
var querystring = require('querystring');
var moment = require('moment'); var utils = {
isFunction: function(arg) {
return typeof arg === 'function';
}
}; /**
* 加密
* @param str
* @param secret
* @returns {Query|*|{$inc}}
*/
utils.encrypt = function(str, secret) {
var cipher = crypto.createCipher('aes192', secret);
var enc = cipher.update(str, 'utf8', 'hex');
enc += cipher.final('hex');
return enc;
}; /**
* 解密
* @param str
* @param secret
* @returns {Query|*|{$inc}}
*/
utils.decrypt = function(str, secret) {
var decipher = crypto.createDecipher('aes192', secret);
var dec = decipher.update(str, 'hex', 'utf8');
dec += decipher.final('utf8');
return dec;
}; /**
* SHA1签名
*/
utils.sha1 = function(str) {
var sha1sum = crypto.createHash('sha1');
sha1sum.update(str, 'utf8');
str = sha1sum.digest('hex');
return str;
}; /**
* MD5签名
*/
utils.md5 = function(str) {
var md5sum = crypto.createHash('md5');
md5sum.update(str);
str = md5sum.digest('hex');
return str;
}; /**
* 检查一个字符串是不是数字
* @param s
* @returns {boolean}
*/
utils.isNum = function(s) {
if (s != null && s != "") {
return !isNaN(s);
}
return false;
}; /**
* 检查是否是在微信中
* @param req
* @returns {boolean}
*/
utils.inMicroMessenger = function(req) {
return (req.headers['user-agent'] && req.headers['user-agent'].indexOf('MicroMessenger') > -1);
}; /**
* 检查是否是在移动端
* @param req
* @returns {boolean}
*/
utils.inMobile = function(req) {
var inMobile = false;
if (req.headers['user-agent']) {
inMobile = !!req.headers['user-agent'].toLowerCase().match(/(iphone|ipod|ipad|android)/)
} return inMobile;
}; /** * 处理过长的字符串,截取并添加省略号
* 注:半角长度为1,全角长度为2
* **/
utils.autoAddEllipsis = function(pStr, pLen) {
var _ret = cutString(pStr, pLen);
var _cutFlag = _ret.cutflag;
var _cutStringn = _ret.cutstring;
if ("1" == _cutFlag) {
return _cutStringn + "...";
} else {
return _cutStringn;
}
}; /*
* 取得指定长度的字符串
* 注:半角长度为1,全角长度为2
*
* pStr:字符串
* pLen:截取长度
*
* return: 截取后的字符串
*/
function cutString(pStr, pLen) {
// 原字符串长度
var _strLen = pStr.length;
var _tmpCode;
var _cutString;
// 默认情况下,返回的字符串是原字符串的一部分
var _cutFlag = "1";
var _lenCount = 0;
var _ret = false; if (_strLen <= pLen / 2) {
_cutString = pStr;
_ret = true;
}
if (!_ret) {
for (var i = 0; i < _strLen; i++) {
if (isFull(pStr.charAt(i))) {
_lenCount += 2;
} else {
_lenCount += 1;
} if (_lenCount > pLen) {
_cutString = pStr.substring(0, i);
_ret = true;
break;
} else if (_lenCount == pLen) {
_cutString = pStr.substring(0, i + 1);
_ret = true;
break;
}
}
} if (!_ret) {
_cutString = pStr;
_ret = true;
} if (_cutString.length == _strLen) {
_cutFlag = "0";
}
return {"cutstring": _cutString, "cutflag": _cutFlag};
} //去掉首位空格
utils.trim = function(str) {
if (!str) {
return str;
}
str = str.replace(/^(\s|\u00A0)+/, '');
for (var i = str.length - 1; i >= 0; i--) {
if (/\S/.test(str.charAt(i))) {
str = str.substring(0, i + 1);
break;
}
}
return str;
};
/*
* 判断是否为全角
*
* pChar:长度为1的字符串
* return: true:全角
* false:半角
*/
function isFull(pChar) {
if ((pChar.charCodeAt(0) > 128)) {
return true;
}
return false;
} /** 检查字符串是否以subStr结尾 **/
String.prototype.endWith = function(subStr) {
if (!subStr) {
return false;
}
if (subStr.length > this.length) {
return false;
}
else {
return (this.lastIndexOf(subStr) == (this.length - subStr.length));
}
}; /** 检查字符串是否以subStr开头 **/
String.prototype.startWith = function(subStr) {
if (!subStr) {
return false;
}
if (subStr.length > this.length) {
return false;
}
else {
return (this.indexOf(subStr) == 0);
}
}; String.prototype.replaceAll = function(sptr, sptr1) {
var that = this;
while (that.indexOf(sptr) >= 0) {
that = that.replace(sptr, sptr1);
}
return that;
}; /**
* 用于支持对象合并。
* @param {Object} target 要合并的目标对象
* @param {Object} obj 要合并的对象
*/
utils.mixin = function(target, obj) {
for (var key in obj) {
if (target.hasOwnProperty(key)) {
//console.info('Don\'t allow override existed prototype method. method: ' + key);
continue;
}
target[key] = obj[key];
}
}; /**
* 显示时刻
* @param tick
* @returns {*}
*/
utils.tickShower = function(tick) {
if (!tick) {
return 0;
}
var second = 1000;
var minute = second * 60;
var hour = minute * 60;
var day = 24 * hour;
var time = '';
if (tick >= day) {
time += parseInt(tick / day) + '天';
tick %= 24 * 3600 * 1000;
}
if (tick >= hour) {
time += parseInt(tick / hour) + '小时';
tick %= 3600 * 1000;
}
if (tick >= minute) {
time += parseInt(tick / minute) + '分钟';
tick %= 60 * 1000;
}
if (tick > second) {
time += parseInt(tick / second) + '秒';
}
return time;
}; /**
* 模糊显示时刻
* @param tick
* @returns {*}
*/
utils.fuzzyTickShower = function(tick) {
if (!tick) {
return 0;
}
var second = 1000;
var minute = second * 60;
var hour = minute * 60;
var day = 24 * hour;
var time = '';
if (tick > day) {
time = '少于' + (parseInt(tick / day) + 1) + '天';
return time;
}
if (tick > hour) {
if (tick == day) {
time = '1天';
} else {
time = '少于' + (parseInt(tick / hour) + 1) + '小时';
}
return time;
}
if (tick >= minute) {
time += parseInt(tick / minute) + '分钟';
tick %= 60 * 1000;
}
if (tick > second) {
time += parseInt(tick / second) + '秒';
}
return time;
}; /**
* 处理查询错误,遇到错误会展示错误界面
* @param res
* @param title
* @param callback
* @returns {Function}
*/
utils.wrapper = function(res, title, callback) {
return function(err, data) {
if (typeof title === 'function') {
callback = title;
title = null;
}
callback = callback || function() {
}; if (!data) {
err = new Error('无此数据');
}
if (err) {
res.render('info', {title: title || '获取数据失败', message: err.message});
}
else {
return callback(err, data);
}
};
}; /**
* 获取客户端IP
* @param req
* @returns {*}
*/
utils.getClientIp = function(req) {
return (req.headers['x-forwarded-for'] ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress).match(/\d+\.\d+\.\d+\.\d+/);
}; utils.check_digest = function(query, secret) {
var digest = this.create_digest(query, secret); //console.log('digest:' + digest); var sign = query.signature; return (sign && sign == digest);
}; utils.create_digest = function(query, secret) {
//console.log('Xquery:' + JSON.stringify(query));
//console.log('Xkey:' + secret); var queries = new Array();
for (var key in query) {
if (key.toLowerCase() != 'signature') {
queries.push(query[key]);
}
} queries.push(secret); //console.log('queries:' + JSON.stringify(queries));
var s = queries.sort().join(''); //console.log('source:' + s);
//
//console.log('X:' + this.sha1(s.toLowerCase())); //将值排序并合并为一个字符串
return this.sha1(s);
}; /**
* 验证sign
* @param {object} req request对象
* @param {string} secretKey 应用的secretKey
* @returns {q.signature|*|wrap.signature|boolean}
*/
utils.checkSign = function(req, secretKey) {
var sign = req.query.signature || req.body.signature || req.headers['signature']; //对params里的value进行排序
var arrValue = [];
if (req.method === 'POST') {
for (var key in req.body) {
if (key.toLowerCase() != 'signature') {
arrValue.push(req.body[key]);
}
}
}
var digest = this._generateSign(req.method, req.originalUrl, arrValue, secretKey); //console.log('digest:' + digest); return (sign && sign === digest);
}; utils._generateSign = function(method, path, arrValue, secretKey) {
//将method转为大写
method = method.toUpperCase();
if (method !== 'GET' && method !== 'POST') {
throw new Error('method is invalid');
} //logger.trace(path); var urlParams = url.parse(path);
var host = urlParams.host;
var path = urlParams.pathname; //把URL中的所有参数都加进来
var queries = querystring.parse(urlParams.query);
for (var key in queries) {
if (key.toLowerCase() != 'signature') {
arrValue.push(queries[key]);
}
} arrValue.push(secretKey);
arrValue.push(path);
arrValue.push(method);
arrValue.sort(); console.log(arrValue);
var s = arrValue.sort().join(''); //console.log('sources:' + s); return this.sha1(s);
}; /**
* 生成sign
*
* 将urlpath、除签名字段外的所有参数、请求方法和secretKey放在同一数组中排序后组成字符串作为源串进行签名
*
* @param {string} path url里的path路径
* @param {object} params 参数对象
* @param {string} method 请求方法,GET或POST
* @param {string} secretKey 应用的secretKey
* @return {string} 生成的sign
*/
utils.generateSign = function(path, params, method, secretKey) {
if (typeof params !== 'object') {
throw new Error('params is invalid');
} //对params里的value进行排序
var arrValue = [];
for (var key in params) {
if (key.toLowerCase() != 'signature') {
arrValue.push(params[key]);
}
}
return this._generateSign(method, path, arrValue, secretKey);
}; /**
* 获取当天,本周,本月的开始时间和结束时间段
* @param t 当天:day, 本周:week,本月 month
*/
utils.getCurrentPeriod = function(t) {
if (t === 'day') {
return {
start_at: moment().startOf('day'),
end_at: moment().endOf('day')
}
} else if (t === 'week') {
//老外的星期是从周日开始算,所以我们的要加1
return {
start_at: moment().startOf('week').add(1, 'day'),
end_at: moment().endOf('week').add(1, 'day')
};
} else if (t === 'month') {
return {
start_at: moment().startOf('month'),
end_at: moment().endOf('month')
}
}
return null;
}; module.exports = utils;
nodejs自己在项目中使用的一个工具库utils.js文件的更多相关文章
- C#项目中关于多个程序集下App.config文件的问题
在项目中我们会经常用到App.config文件,有的是自动生成的,比如引用webservice.wcf服务时生成:也有手动建立的配置文件直接默认名就为app.config.这些配置有的保存当前程序集用 ...
- eclipse中如何查看一个android模拟器的内部文件
eclipse中如何查看一个android模拟器的内部文件,有时要在其中添加一个文件夹或是什么的,要手动的做这件事,而不能够用代码去完成时,就要用这个方法了. 1.首先,打开一个安卓模拟器. 2.这个 ...
- 学以致用:手把手教你撸一个工具库并打包发布,顺便解决JS浮点数计算精度问题
本文讲解的是怎么实现一个工具库并打包发布到npm给大家使用.本文实现的工具是一个分数计算器,大家考虑如下情况: \[ \sqrt{(((\frac{1}{3}+3.5)*\frac{2}{9}-\fr ...
- Laravel 项目中编写第一个 Vue 组件
和 CSS 框架一样,Laravel 不强制你使用什么 JavaScript 客户端框架,但是开箱对 Vue.js 提供了良好的支持,如果你更熟悉 React 的话,也可以将默认的脚手架代码替换成 R ...
- MES项目中出现的一个事务嵌套的使用场景
昨天在MES项目中,需要在业务逻辑的几个关键点记录错误信息,需要把错误信息写入数据表. 但是由于整个业务逻辑都是包在一个事务模板里面的 比如这样的: WhhTransactionTemplate tr ...
- iOS项目中常用的第三方开源库
1.项目使用的第三方开源库 项目使用了CocoaPods(类似java中的maven)管理常用的第三方库,一些特殊的单独引用,下面介绍下比较好用的几个. (1)AFNetworking 目前比较推荐的 ...
- 在Android项目中调用已有.so库
注意该.so库指的是android平台的,非一般linux.unix平台:1.现有库libcom_ycan_testLib.so2.新建android项目TestLib23.添加新类:类名:testL ...
- 在react-native项目中使用iconfont自定义图标库(android)
1. 安装react-native-vector-icons yarn add react-native-vector-icons react-native link 如果没有关联成功的话,可以参考官 ...
- iOS 清理Xcode项目中没有使用到的图片资源和类文件
接手到一个旧的项目,但是发现里面有太多的无用资源,包括升级app后,一些无用的图片资源并没有被删掉,导致app在打包成ipa包以后,文件变大.手边这个项目IM要更换成环信的IM,之前的一些旧的SDK, ...
随机推荐
- nginx 502 错误
今天帮朋友处理一个程序报错,重启nginx服务之后,发现首页打不开了,但是静态文件可以打开 经检查nginx 服务器正常运行,重启无数次仍然502错误,考虑到静态文件可以打开,怀疑可能是php 脚本程 ...
- POJ 2481 Cows (数组数组求逆序对)
题目链接:http://poj.org/problem?id=2481 给你n个区间,让你求每个区间被真包含的区间个数有多少,注意是真包含,所以要是两个区间的x y都相同就算0.(类似poj3067, ...
- hibernate和mybatis
本来是个菜鸟程序员,现在大学还没毕业. 最近一直在想一个问题,到底是hibernate好还是mybatis好.我总觉得 hibernate好用之极,在大学里做过的小项目都是用的hibernate,只要 ...
- SQLite的37个核心函数
转载:http://www.feiesoft.com/00012/ abs(X) abs(X)返回 X 的绝对值. Abs(X) returns NULL if X is NULL. Abs(X) r ...
- Thinkphp框架----微信公众测试号开发(2)
---恢复内容开始--- 最近忙着投简历找工作.现在继续更 微信回复图文设置. 效果: 页面HTML需要一个form表单 简单效果: 接下来是数据库 字段:id title(标题) text(描述) ...
- [JS 基础] touchEvent中的changedTouches,targetTouches和touches的区别
对于移动端开发中 touchEvent(触摸事件) 中changedTouches,targetTouches和touches的区别往往不容易弄清,故特意查询了 MDN相关资料 1. 其中,对 cha ...
- cocos2d-x 缓动曲线
转自:http://blog.csdn.net/cocos2der/article/details/7261808 在实现运动中,我们常常需要实现一些加速度或者减速度的效果,cocos2d-x引擎为我 ...
- PostgreSQL的 initdb 源代码分析之十九
继续分析: setup_dictionary(); 展开: 其中: cmd 是:"/home/pgsql/project/bin/postgres" --single -F -O ...
- SQL Server活动监视器
打开SQL Server活动监视器:
- 根据条件自定义 cxGrid 的单元格样式
当指定的单元格需要指定样式(如字体颜色设置为红色,背景色设置为黄色)时,可按如下步骤进行: 1.添加 csStyleRepository 控件,并新建 Style,设置前景(TextColor).背景 ...