道者编程

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


最新评论:
我要评论:

看不清楚