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
}
}
}