nodeJs读写流(读取json目录文件后,自定义写入新文件中)

来源:互联网 发布:纯粹主义 美学 知乎 编辑:程序博客网 时间:2024/06/05 03:17

需求:将data目录下的所有json文件中的内容,依次读取出来按照一定的规则封装后输出到MockData.js文件夹中

这里写图片描述
输出:
这里写图片描述

解决方法想到了3种方式:

1. 在MockData.js中,将mock函数的url先配置好请求链接,然后循环使用ajax请求得到json数据写入对应的数据模版中;(ajax的url不能和mock函数的url同名)
2. 在node环境中,将所有文件中的json数据依次读出来放入到一个新建的json文件中,然后对此json文件进行json对象转换解析,取出mock函数url对应的对象,再拼接封装出需要的格式;(适合json数据少且对象名不重复,json数据量大的话,解析成json对象的时候可能会崩掉)
3. 在node环境中,对data目录名进行读取,依次根据目录名读取json文件,对json文件中的每个json对象进行mock封装,直接输出到MockData.js文件中;

根据开发需求,3是最优的解决方案,因此采用3

使用文件流的形式读写,且脑海中要有以下概念:

1. 流的data事件可能会被触发很多次
2. writeFile会覆盖已经存在的文件
3. 用highWaterMark设置来控制每次读取的大小
4. 在end中进行写操作
5. json文件为空时进行过滤操作

代码段:

// MockDatagulp.task('MockData', ['clean'], function () {    var baseUrl = 'data';    var dataName = '';    var dataValue = '';    var appendData=''    var mockJsFile = './scripts/plugins/mockData/MockData.js';    var fileReadStream;    var files;    if (fs.existsSync(baseUrl)) { //获取目录下的文件        files = fs.readdirSync(baseUrl);        createStramFile();    } else {        console.log(baseUrl + "  Not Found!");    }    fs.writeFileSync(mockJsFile,'define(\'MockData\', [\'jquery\', \'plugins/mockData/mock-min\'], function ($, Mock) {\n','utf8'); //同步写入    function createStramFile() {        if (!(files.length)) {            fs.appendFileSync(mockJsFile,'\n return {config: {isMock: true}};});','utf8')            console.log('copy Done');            return;        }        var chunks=[];        var size =0;        var _thisFile = files.shift();        var currentfile = baseUrl + '/' + _thisFile;        fileReadStream = fs.createReadStream(currentfile, {highWaterMark:64 * 1024}); //highWaterMark控制每次读取的大小        fileReadStream.setEncoding('UTF-8');        fileReadStream.on('data',(chunk) => { //读取数据,可能会分几次读完            console.log('chunkLen:',chunk.length)            if(typeof chunk != 'Buffer')                chunk = new Buffer(chunk);            chunks.push(chunk);            size += chunk.length;        })        fileReadStream.on('end',() => { //数据读完时写入            if(chunks.length){                var wholeJson = Buffer.concat(chunks,size)                var records = JSON.parse(wholeJson);                if(!records)return;                for(var item in records){                    dataName = item;                    dataValue = JSON.stringify(records[item]);                    appendData = 'Mock.mock("/'+_thisFile.replace('.json','')+'/'+dataName+'",'+dataValue+');\n'                    fs.appendFileSync(mockJsFile,appendData,'utf8')                }            }else{                console.log('Json文件为空!');            }            createStramFile();        })    }});

参考博客:http://blog.csdn.net/mdifferent/article/details/51242484

阅读全文
0 0