1.第一版本,读取某个固定文件目录下的文件,写成接口

初版本1.1

缺点:文件更新了,接口不会更新

let path = require("path");
let fs = require("fs");
let http= require("http");

fs.readFile('./config.json', (err, data) => {
    if (err) throw err;
    let fileDir = JSON.parse(data.toString()).fileDirectory;
    fs.readdir(fileDir,(err,files) => {
        if(err) throw err;
        let data = JSON.stringify({"data": files});
        let serve = http.createServer((request, response) => {
            response.writeHead(200, {
                'Access-Control-Allow-Origin': '*',
                'Content-Type': 'application/json; charset=utf-8'
            });
            response.end(data);
        });
        serve.listen(5000);
        console.log('http://127.0.0.1:5000');
    });
})

2.第二版本

版本1.2,解决上面文件夹目录更新不刷新的问题

缺点:回调嵌套过深,建议采用Promise或者async/await写法

let path = require("path");
let fs = require("fs");
let http= require("http");

let serve = http.createServer((request, response) => {
    response.writeHead(200, {
        'Access-Control-Allow-Origin': '*',
        'Content-Type': 'application/json; charset=utf-8'
    });
    fs.readFile('./config.json', (err, data) => {
        if (err) throw err;
        let fileDir = JSON.parse(data.toString()).fileDirectory;
        fs.readdir(fileDir,(err,files) => {
            if(err) throw err;
            let data = JSON.stringify({"data": files});
            response.end(data);
        });
    }) 
});
serve.listen(5000);
console.log('http://127.0.0.1:5000');

3.第三版本

增加需求,可读取文件夹下的文件夹,文件夹下面还可以有文件夹,套娃结构,类似于编辑文档的功能

分析:存数据的数据类型如何设计

问题:node写的get接口用浏览器访问会默认请求两次,因为浏览器会请求图标

遇到问题,因为文件是异步读取的,而且因为是深层嵌套的,递归的,应该读取完成再发消息告诉读取方法外面,我读完了,但是现在因为是异步+递归的,好像没办法知道啥时候递归结束 暂时没想到办法判断啥时候递归结束了 ,所以说得把异步读取改成同步读取,但是如果文件夹结构很深的话,是不是会很慢呢,所以应该怎么做呢,异步读取,读一级返回一级,是不是应该这么做呢,这么做的话前端如何加载呢,有待思考。

异步读取代码半成品 因为写不下去了 但是这个异步读取等递归完,其实跟同步效果是一样的:

let fs = require("fs");
let http= require("http");

let serve = http.createServer((_, response) => {
    response.writeHead(200, {
        'Access-Control-Allow-Origin': '*',
        'Content-Type': 'application/json; charset=utf-8'
    });
    let filesAll = [];
    fs.readFile('./config.json', (err, data) => {
        if (err) throw err;
        let pathfileDir = JSON.parse(data.toString()).fileDirectory;   
        function readFileDir(dir){
            fs.readdir(dir,(err,files) => {
                if(err) throw err;
                files.forEach(item => {
                    if(fs.lstatSync((dir+'/'+item)).isDirectory()){
                        readFileDir((dir+'/'+item));
                    }else{
                        filesAll.push(item);
                    }
                })
            });
        }
        readFileDir(pathfileDir);
        // let data = JSON.stringify({"data": filesAll});
        response.end('');
    })
    
});

serve.listen(5000);
console.log('http://127.0.0.1:5000');

4.第四版本

将端口提取出来,并打包成windows,linux,mac平台可直接执行的文件

待做,将代码改成Promise或async/await形式

{
	"fileDirectory": "E:/GIS项目视频资料/读文件",
	"port": "5000"
}
let fs = require("fs");
let http= require("http");

let configData = fs.readFileSync('./config.json');
let pathfileDir = JSON.parse(configData.toString()).fileDirectory;   
let port = JSON.parse(configData.toString()).port;   
let serve = http.createServer((_, response) => {
    response.writeHead(200, {
        'Access-Control-Allow-Origin': '*',
        'Content-Type': 'application/json; charset=utf-8'
    });
    let filesAll = [];  
        function readFileDir(dir){
            let filesDir = fs.readdirSync(dir);
            filesDir.forEach(item => {
                if(fs.lstatSync((dir+'/'+item)).isDirectory()){
                    readFileDir((dir+'/'+item));
                }else{
                    filesAll.push(item);
                }
            })
        }
        readFileDir(pathfileDir);
        let fileData = JSON.stringify({"data": filesAll});
        response.end(fileData);
});
serve.listen(port);
console.log('http://127.0.0.1:'+port);