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

需求:将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文件为空时进行过滤操作

代码段:


// MockData
gulp.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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值