首先附上抓包工具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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。