文件内容如下:

/**
* 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文件的更多相关文章

  1. C#项目中关于多个程序集下App.config文件的问题

    在项目中我们会经常用到App.config文件,有的是自动生成的,比如引用webservice.wcf服务时生成:也有手动建立的配置文件直接默认名就为app.config.这些配置有的保存当前程序集用 ...

  2. eclipse中如何查看一个android模拟器的内部文件

    eclipse中如何查看一个android模拟器的内部文件,有时要在其中添加一个文件夹或是什么的,要手动的做这件事,而不能够用代码去完成时,就要用这个方法了. 1.首先,打开一个安卓模拟器. 2.这个 ...

  3. 学以致用:手把手教你撸一个工具库并打包发布,顺便解决JS浮点数计算精度问题

    本文讲解的是怎么实现一个工具库并打包发布到npm给大家使用.本文实现的工具是一个分数计算器,大家考虑如下情况: \[ \sqrt{(((\frac{1}{3}+3.5)*\frac{2}{9}-\fr ...

  4. Laravel 项目中编写第一个 Vue 组件

    和 CSS 框架一样,Laravel 不强制你使用什么 JavaScript 客户端框架,但是开箱对 Vue.js 提供了良好的支持,如果你更熟悉 React 的话,也可以将默认的脚手架代码替换成 R ...

  5. MES项目中出现的一个事务嵌套的使用场景

    昨天在MES项目中,需要在业务逻辑的几个关键点记录错误信息,需要把错误信息写入数据表. 但是由于整个业务逻辑都是包在一个事务模板里面的 比如这样的: WhhTransactionTemplate tr ...

  6. iOS项目中常用的第三方开源库

    1.项目使用的第三方开源库 项目使用了CocoaPods(类似java中的maven)管理常用的第三方库,一些特殊的单独引用,下面介绍下比较好用的几个. (1)AFNetworking 目前比较推荐的 ...

  7. 在Android项目中调用已有.so库

    注意该.so库指的是android平台的,非一般linux.unix平台:1.现有库libcom_ycan_testLib.so2.新建android项目TestLib23.添加新类:类名:testL ...

  8. 在react-native项目中使用iconfont自定义图标库(android)

    1. 安装react-native-vector-icons yarn add react-native-vector-icons react-native link 如果没有关联成功的话,可以参考官 ...

  9. iOS 清理Xcode项目中没有使用到的图片资源和类文件

    接手到一个旧的项目,但是发现里面有太多的无用资源,包括升级app后,一些无用的图片资源并没有被删掉,导致app在打包成ipa包以后,文件变大.手边这个项目IM要更换成环信的IM,之前的一些旧的SDK, ...

随机推荐

  1. Spring AOP + AspectJ in XML configuration example

    For those don't like annotation or using JDK 1.4, you can use AspectJ in XML based instead. Review l ...

  2. Java IO (2) - OutputStream

    Java IO (2) - OutputStream 前言 JavaIO一共包括两种,一种是stream,一种是reader/writer,每种又包括in/out,所以一共是四种包.Java 流在处理 ...

  3. 需要熟记的git命令

    需要熟记的github常用命令 总结一下ubuntu下github常用的命令,设置部分跳过,假设repository的名字叫hello-world: .创建一个新的repository: 先在gith ...

  4. Light oj 1197 - Help Hanzo (素数筛技巧)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1197 给你a和b求a到b之间的素数个数. 先在小区间素数筛,大区间就用类似素数筛的想法 ...

  5. UVaLive 6859 Points (几何,凸包)

    题意:给定 n 个点,让你用最长的周长把它们严格包围起来,边长只能用小格子边长或者是小格子对角线. 析:先把每个点的上下左右都放到一个集合中,然后求出一个凸包,然后先边长转成题目的方式,也好转两个点的 ...

  6. C#下内存管理--垃圾收集

    章节安排 内存管理简介 垃圾回收机制 性能问题 C#下非托管资源的处理 要强调的几点 References 内存管理简介 对于任何一种编程语言,内存管理都是不得不提很重要的一块内容,但可惜的是目前为止 ...

  7. C#学习笔记(五):泛型

    认识泛型 泛型使类型参数化,从而实现了算法上的代码重用. 同时由于去掉了转换中装箱和拆箱的操作,使用泛型还可以提高程序的运行速度. 我们先看看C#自带的使用了泛型的类: using System.Co ...

  8. C语言单向循环链表解决约瑟夫问题

    据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,4 ...

  9. MFC实现数独(2)

    主要功能描述: 运行程序后对话框会显示一个9x9的待输入数独区域,并提供随机生成数独和生成数独按钮,生成数独按钮后会创建数独并随机显示其中一个至数独区域,随机生成数独会从已生成的数独中随机获取一个并显 ...

  10. Navicat for mysql 11.0破解方法

    Navicat for mysql破解器 首先下载破解器,然后解压至随意一个目录下.最后双击exe程序,按照提示找到你安装好的navicat for mysql文件夹下的navicat.exe程序,之 ...