nodejs一些常用的方法
第一次干node项目是用koa框架,后来api基本上都用node了,代码简洁,IO性能高效。记录一些以前常用的方法
1:微信支付签名,也可以用于api签名校验,把所有参数按照url规则根据ASCII码(字典序)排序,算出一个值,后端校验这个值,防止参数篡改
//签名 function getSign(args,key){ let keys = Object.keys(args); //object转array keys = keys.sort(); // 参数名ASCII码从小到大排序(字典序) let newArgs = {}; keys.forEach(function (key) { if (args[key] != "" && args[key] != 'undefined' && Array.isArray(args[key]) ===false) { //如果参数的值为空不参与签名,或者二级以上; newArgs[key] = args[key]; //参数名区分大小写; } }) // obj转成URL键值对 let str = '' for (let k in newArgs) { str += '&' + k + '=' + newArgs[k]; } str = str.substr(1)+'&key='+key; //最后拼接key return md5(str).toUpperCase(); //MD5转大写 } // MD5加密 function md5(str) { //npm install crypto const crypto = require('crypto'); const md5 = crypto.createHash('md5'); md5.update(str); return md5.digest('hex'); }2:返回限定的随机数
/** * 返回随机数 * @param {*} min 最小 * @param {*} max 最大 */ range:function(min, max) { return Math.floor(Math.random() * (max - min) ) + min; }3:16位整数转16进制字节码
/** * 16位整数转16进制字节码 * @number 数字number * @return 字符串 形如:'FFFFFFFF' */ uint16ToHexString:function(number) { let ret = []; let string = '0'; if (typeof number === 'string'){ const { hexString } = PMQTPTools.writeUTF8(number); string = hexString.substr(0, 2); } else { string = number.toString(16); } const length = string.length; for (let i = length; 4 - i > 0; i++){ ret.push('0'); } if(length <= 4) { ret.push(string); } else { ret.push(string.substr(-4)); } return ret.join(''); }4:去除字符串前后空格
/** * 去除字符串前后指定字符 * @param {*} str * @param {*} remove 需要去掉的特定字符 */ trim:function(str,remove=',') { //return str.replace(/^(\s|,)+|(\s|,)+$/g, ''); str = str.trim() return str.replace(new RegExp('^\\'+remove+'+|\\'+remove+'+$', 'g'), ''); } /** * 去除左边指定字符 * @param {*} str * @param {*} remove 需要去掉的特定字符 */ ltrim:function(str,remove='') { str = str.trim() return str.replace(new RegExp('^\\'+remove+'+', 'g'), ''); } /** * 去除右边指定字符 * @param {*} str * @param {*} remove 需要去掉的特定字符 */ rtrim:function(str,remove='') { str = str.trim() return str.replace(new RegExp('\\'+remove+'+$', 'g'), ''); }5:数组转URL字符串
/** * 数组转URL字符串 * @param {*} params {a:'li',b:123,c:456} * return a=li&b=123&c=456 */ http_build_query:function(params) { if(params == '' || typeof(params) == 'undefined'){ return } let url = ''; for (let index in params){ url += '&'+index+'='+escape(params[index]); } return url.substr(1); //去除第一个& }6:时间
/** * 获取当天结束时候的时间戳 * @param {*} 1 返回 秒,否则返回微妙 */ endTime:function(state=1) { let endTime = new Date().setHours(23, 59, 59).toString() if( state == 1 ){ endTime = endTime.substr(0,10) } return endTime } /** * 格式化时间 * @param {*} date * @param {*} fmt */ date_ftt:function(date, fmt = 'yyyy-MM-dd hh:mm:ss') { //author: meizz if (date == null) { return ''; } var o = { "M+": date.getMonth() + 1, //月份 "d+": date.getDate(), //日 "h+": date.getHours(), //小时 "m+": date.getMinutes(), //分 "s+": date.getSeconds(), //秒 "q+": Math.floor((date.getMonth() + 3) / 3), //季度 "S": date.getMilliseconds() //毫秒 }; if (/(y+)/.test(fmt)){ fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length)); } for (var k in o){ if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); } return fmt; }
7:一些常用的验证validation
module.exports = { /** * 判断是否为空 * @param {*} res * @param {string} message */ empty:function (res='',message='不能为空') { if( typeof(res)=='string' ){ res = res.trim() } if( res == '' || typeof(res) == 'undefined' ){ throw({err:'validation_error',message:message}) }else{ return res } }, /** * 特殊判断是否为空,一般用于修改 * @param {*} res * @param {string} message */ speEmpty:function (res='',condition=0,message='不能为空') { if( typeof(res)=='string' ){ res = res.trim() } if( res == '' || typeof(res) == 'undefined' ){ if( condition == 0 ){ throw({err:'validation_error',message:message}) }else{ return ''; } }else{ return res } }, /** * 判断是否为数字,不包括负数和小数点 * @param {*} res * @param {string} message */ number:function (res='',message='格式不正确') { if( typeof(res)=='string' ){ res = res.trim() } var reg=/^[0-9]*$/ if (res == '' || typeof(res) == 'undefined' || !reg.test(res)){ throw({err:'validation_error',message:message}) }else{ return res } }, /** * 判断是否相等 * @param {*} res 要比对的字段 * @param {*} target 目标字段 * @param {*} message */ eq:function (res,target,message='不匹配') { if( typeof(res)=='string' ){ res = res.trim() } if( typeof(target)=='string' ){ target = target.trim() } if( res == '' || res != target || typeof(res) == 'undefined'){ throw({err:'validation_error',message:message}) }else{ return res } }, /** * 判断字符串长度是否大于某个数 * @param {*} res * @param {*} number * @param {*} message */ gtStr:function(res,number,message='大于') { if( typeof(res)!='string' ){ res = res.toString() } res = res.trim() if( res.length > number ){ throw({err:'validation_error',message:message}) } return res }, /** * 验证手机号是否正确 1 开头,11位 * @param {*} res * @param {*} message */ checkPhone:function(res,message='手机号不正确') { res = res.trim() var reg=/^1(3|4|5|6|7|8|9)\d{9}$/ if (res == '' || typeof(res) == 'undefined' || !reg.test(res)){ throw({err:'validation_error',message:message}) }else{ return res } }, /** * 验证邮箱 * @param {*} res * @param {*} message */ checkEmail:function(res,message='邮箱格式不正确') { res = res.trim() var reg=/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/ if (res == '' || typeof(res) == 'undefined' || !reg.test(res)){ throw({err:'validation_error',message:message}) }else{ return res } } }