头图

首先附上抓包工具fidder工具使用文档地址,不懂的可以根据文档本地试一下。
(https://www.kancloud.cn/ncymkj/development_document/2055849)

下面是接口返回的数据格式:

{
  "Format": "Json",
  "Content": [
      {
          "Id": 228872,
          "ParentId": 0,
          "OrderId": 0,
          "CateName": "大桶洗护",
          "Spell": "DATONGXIHU",
          "ParentChain": "",
          "TypeId": 0,
          "Children": []
      },
      {
          "Id": 277294,
          "ParentId": 0,
          "OrderId": 0,
          "CateName": "单支染膏",
          "Spell": "CHANZHIRANGAO",
          "ParentChain": "",
          "TypeId": 0,
          "Children": []
      },
      {
          "Id": 277292,
          "ParentId": 0,
          "OrderId": 0,
          "CateName": "滴滴浓缩洗发水",
          "Spell": "DIDINONGSUXIFASHUI",
          "ParentChain": "",
          "TypeId": 0,
          "Children": []
      },
      {
          "Id": 277293,
          "ParentId": 0,
          "OrderId": 0,
          "CateName": "黑油专区",
          "Spell": "HEIYOUZHUANOU",
          "ParentChain": "",
          "TypeId": 0,
          "Children": []
      },
      {
          "Id": 277295,
          "ParentId": 0,
          "OrderId": 0,
          "CateName": "冷烫药水",
          "Spell": "LENGTANGYAOSHUI",
          "ParentChain": "",
          "TypeId": 0,
          "Children": []
      },
{
          "Id": 225512,
          "ParentId": 0,
          "OrderId": 6,
          "CateName": "美发辅材系列",
          "Spell": "MEIFAFUCAIJILIE",
          "ParentChain": "",
          "TypeId": 0,
          "Children": [
              {
                  "Id": 228472,
                  "ParentId": 225512,
                  "OrderId": 1,
                  "CateName": "保鲜膜",
                  "Spell": "BAOXIANMO",
                  "ParentChain": "225512",
                  "TypeId": 0,
                  "Children": []
              },
              {
                  "Id": 228473,
                  "ParentId": 225512,
                  "OrderId": 2,
                  "CateName": "手套",
                  "Spell": "SHOUTAO",
                  "ParentChain": "225512",
                  "TypeId": 0,
                  "Children": []
              },
              {
                  "Id": 228474,
                  "ParentId": 225512,
                  "OrderId": 3,
                  "CateName": "水壶",
                  "Spell": "SHUIHU",
                  "ParentChain": "225512",
                  "TypeId": 0,
                  "Children": []
              },
              {
                  "Id": 228475,
                  "ParentId": 225512,
                  "OrderId": 4,
                  "CateName": "围布披肩",
                  "Spell": "WEIBUPIJIAN",
                  "ParentChain": "225512",
                  "TypeId": 0,
                  "Children": []
              },
              {
                  "Id": 228476,
                  "ParentId": 225512,
                  "OrderId": 5,
                  "CateName": "洗头床辅材",
                  "Spell": "XITOUCHUANGFUCAI",
                  "ParentChain": "225512",
                  "TypeId": 0,
                  "Children": []
              },
              {
                  "Id": 228477,
                  "ParentId": 225512,
                  "OrderId": 6,
                  "CateName": "染发碗刷/染发用具",
                  "Spell": "RANFAWANSHUA/RANFAYONGJU",
                  "ParentChain": "225512",
                  "TypeId": 0,
                  "Children": []
              },
              {
                  "Id": 228478,
                  "ParentId": 225512,
                  "OrderId": 7,
                  "CateName": "毛巾",
                  "Spell": "MAOJIN",
                  "ParentChain": "225512",
                  "TypeId": 0,
                  "Children": []
              },
              {
                  "Id": 228479,
                  "ParentId": 225512,
                  "OrderId": 8,
                  "CateName": "烫发辅材工具",
                  "Spell": "TANGFAFUCAIGONGJU",
                  "ParentChain": "225512",
                  "TypeId": 0,
                  "Children": []
              },
              {
                  "Id": 228480,
                  "ParentId": 225512,
                  "OrderId": 9,
                  "CateName": "其他品种",
                  "Spell": "JITAPINCHONG",
                  "ParentChain": "225512",
                  "TypeId": 0,
                  "Children": []
              }
          ]
      },
      {
          "Id": 277298,
          "ParentId": 0,
          "OrderId": 0,
          "CateName": "双氧专区",
          "Spell": "SHUANGYANGZHUANOU",
          "ParentChain": "",
          "TypeId": 0,
          "Children": []
      },
      {
          "Id": 225580,
          "ParentId": 0,
          "OrderId": 0,
          "CateName": "套盒/发膜/护理",
          "Spell": "TAOHE/FAMO/HULI",
          "ParentChain": "",
          "TypeId": 0,
          "Children": []
      },
      {
          "Id": 225582,
          "ParentId": 0,
          "OrderId": 0,
          "CateName": "洗护系列",
          "Spell": "XIHUJILIE",
          "ParentChain": "",
          "TypeId": 0,
          "Children": []
      },
      {
          "Id": 228947,
          "ParentId": 0,
          "OrderId": 0,
          "CateName": "专业去屑防脱洗护",
          "Spell": "ZHUANYEQUXIEFANGTUOXIHU",
          "ParentChain": "",
          "TypeId": 0,
          "Children": []
      },
      {
          "Id": 231253,
          "ParentId": 0,
          "OrderId": 6,
          "CateName": "接发(头发及辅材)",
          "Spell": "JIEFA(TOUFAJIFUCAI)",
          "ParentChain": "",
          "TypeId": 0,
          "Children": []
      },
      {
          "Id": 232743,
          "ParentId": 0,
          "OrderId": 6,
          "CateName": "美发仪器发廊家具系列",
          "Spell": "MEIFAYIQIFALANGGUJUJILIE",
          "ParentChain": "",
          "TypeId": 0,
          "Children": []
      },
  ],
  "Success": true,
  "Code": 200,
  "Message": "成功"
}

由于该服务器架构都是字段首字母大写,但是我们这边看着不舒服,于是想改一下。
下面着重讲一下怎么实现:
首先我们抓包下来的数据统一用json文件形式报错,然后通过nodeAPI=>fs模块 去读取那些文件,根据fs.readdirSync遍历这些文件,如果是文件夹的话递归调用,直到过滤出所有文件后缀名“.json"的文件,把要处理的数据文件名列表保存起来方便后面使用。然后通过for in循环 + (readFile结合刚才获取的数据文件名列表)形式递归遍历数据,直到最后一层,获取到对象属性key值首字母然后判断他的码值是否在ASCII大写字母码值范围内,在的话就把这个数据转为小写,然后字符串拼接起来,最后保存在新的对象里。
接下来创建一个入口文件main.js,这里主要写调用方法的代码。请注意由于nodejs支持的是commonjs规范,所以这里面只能使用require(xx)/module.exports形式,不能使用ES6 import export形式(要使用的话,要借助第三方库,这里不多赘述,网上资料一大把搜一下完事)。这个文件里可以添加可配置项,例如产出目录名称,笔者这里定义产出目录名称为"/output"。最后在当前工作目录执行“node main"就会对批量文件批量修改字符了。
思考:
这次试验结合了webpack工作原理,其实webpack是基于nodejs开发的。而主流框架vue脚手架又是由 webpack构建的。其实很多东西都是相通的。要想成为一名优秀的前端开发者,这些都要深刻学习。
下面是源码

//处理文件信息
var handlerFile = function (tool,filePath){
    const fs = tool.fs;
    const path = tool.path;
    console.log(filePath,"filePath")
    for(let i = 0;i<filePath.length;i++){
        fs.readFile(filePath[i].targetPath,'utf8',function(err,dataStr){
            console.log(err);
            console.log('-------------');
            dataStr = JSON.stringify(transCapitalLetter(dataStr),null,2); //2代表缩进符
            console.log(dataStr);

            fs.writeFile(path.join(__dirname,"/output",filePath[i].fileName),dataStr,{encoding:'utf8'},function(err){
                if(err) {
                    return console.log(err);
                }
                console.log("File saved successfully!");
            })
        })
    }
    
    function transCapitalLetter(str){
        let json = {};
        if(typeof(str) == "string"){
            json = JSON.parse(str);
        }else{
            json = str;
        }
        
        if(typeof json !== "object"){
            throw new Error("pass the correct type")
        }
        
        let obj = {};
       
            for(let key in json){
                console.log(key,"key",json)
                let val = json[key];
                let strCode = key.charAt(0).charCodeAt()
                let str = String.fromCharCode(strCode);
                if(val?.constructor === Object && val !== null){
                    val = transCapitalLetter(val)
                }else if(val?.constructor === Array){
                    val = transCapitalLetter2(val)
                }
                if(strCode >= 65 && strCode <= 90){ //如果首字母是大写的话
                    str =  str.charAt(0).toLowerCase();
                    key = key.replace(key.charAt(0),str)
                    console.log(key,"key-inner",val)
                    obj[key] = val;
                }else{ //如果首字母不是大写的话
                    obj[key] = val;
                }
                
            }
        
        return obj
    }
    function transCapitalLetter2(array){
        let arr = [];
        for(let item of array){
            if(item?.constructor === Object && item !== null){
                item = transCapitalLetter(item)
            }else if(item?.constructor === Array){
                item = transCapitalLetter2(item)
            }
            arr.push(item);
        }
        return arr 
    }
}
exports.handlerFile = handlerFile

//入口文件 mainjs
const fs = require('fs');
const path = require('path');
const tool = {
    fs,
    path
}
const handlerFileTool = require("./letterCaseConvert");
const readAllFilesTool = require("./readDirFiles");
//let filePath = readDirFiles('./batchProcessingFile')
//创建目录 output
const dirname = "/output"; // 路径可配置
 // 判断该路径是文件夹还是文件
 const outputPath = __dirname + dirname;
 fs.access(outputPath,(err)=>{
    if(err){
        console.log("不存在")
        fs.mkdirSync(outputPath, { recursive: true }, (err) => {
            if (err) throw err;
        });
    }else{
       console.log('存在')
    }
 })

 let filePath = [];
 filePath = readAllFilesTool.readAllFiles();
console.log(filePath,"filep")
handlerFileTool.handlerFile(tool,filePath)
//读取文件方法
const fs = require('fs');
const path = require('path');
var validFileNameLs = [];
const readAllFiles = function readAllFiles(folderPath = __dirname,isDeep){
    console.log(folderPath,"dirname")
    // 读取文件夹列表
  const files = fs.readdirSync(folderPath)
  console.log(files,"files")
  // 遍历文件夹列表
  
  files.forEach(function (fileName) {
    // 拼接当前文件路径
    const filePath = path.join(folderPath, fileName)
    
    // 判断该路径是文件夹还是文件
    const stats = fs.statSync(filePath)

    if (stats.isDirectory()) {
      // 如果是文件夹,递归遍历
      console.log("Directory",filePath)
      //filePath = filePath.splice()
      readAllFiles(filePath,true)
    } else {
      // 如果是文件,执行操作
      console.log(filePath)
        if (filePath.match(/\.json$/)) {
        console.log("文件名以.json为后缀");
        let obj = {
            targetPath:filePath,
            fileName,
        }
        validFileNameLs.push(obj)
      }
    }
   
  })
  return validFileNameLs
}
exports.readAllFiles  = readAllFiles

阳哥
14 声望0 粉丝

一个code爱好者,一个户外运动的爱好者,一个喜欢音乐的爱好者。