通过NodeJs启动本地服务,并完成数据的增删查改功能,其中将数据存在一个json文件中。

/**
 * nodejs 实现数据的增删查改
 * huangh  20171025
 */
var httpserver = require("http");
var qs = require("querystring");
var url = require("url");
var fs = require("fs");

var FileJson = "data.json";//写入内容的文件

httpserver.createServer(onRequest).listen(3000);
console.log('-------服务器已启动,请在浏览器中输入:http://127.0.0.1:3000/');

function onRequest(request,response){
    var pathname = url.parse(request.url).pathname;
    if(pathname=="/" || pathname=="/list.html"){//访问列表页面
        gotoPage(request,response,"list.html")
    }else if(pathname=="/addpage"){//添加页面功能
        addData(request,response);
    }else if(pathname=='/updatepage'){//保存修改内容
        updateData(request,response);
    }else if(pathname=='/update'){//修改页面
        updateShow(request,response);
    }else if(pathname=='/deleteonly'){//单个删除
        deleteOnly(request,response);
    }else{
        var requesturl = request.url,  //端口后后面的链接
            suffix = requesturl.substr(requesturl.lastIndexOf('.')); //文件名
        if (suffix === '.html'){//html页面进行跳转
            gotoPage(request,response,requesturl.substr(1)); 
        }else if(suffix === '.css' || suffix === '.js'|| suffix === '.json'
            || suffix === '.ico' || suffix === '.jpg'|| suffix === '.jpeg'|| suffix === '.png'|| suffix === '.gif') {
            
            var file = getFileContent(__dirname  + requesturl),
                contentType = '' ;

            //content-type设置
            switch(suffix){
                case '.css' : contentType = 'text/css' ;break;
                case '.js'  : contentType = 'application/x-javascript' ;break;
                case '.jpg' :
                case '.jpeg' : contentType = 'image/jpeg' ;break;
                case '.png' : contentType = 'image/png' ;break;
                case '.gif' : contentType = 'image/gif' ;break;
                default : contentType = 'text/html' ; break;
            }
            response.writeHead(200, { 'Content-Type': contentType });
            if(file){
                response.end(file);
            }else{
                response.end();
            }
        }else {
            response.writeHead(200, { 'Content-Type': 'text/html' });
            response.end();
        }
    }
}

/******************************************  数据相关方法 ************************************/
/**新增方法,保存数据
 * @param {[type]} request  
 * @param {[type]} response 
 */
function addData(request,response){
    var urlstr="";
    request.addListener("data",function(postdata){
        urlstr+=postdata;    //接收到的表单数据字符串,这里可以用两种方法将UTF-8编码转换为中文
        var jsondata = qs.parse(urlstr);        //转换成json对象
        
        jsondata.updatetime = new Date().Format("yyyy-MM-dd hh:mm:ss");//更新时间

        var dataArr = fs.readFileSync(FileJson,'utf-8') ; 
        
        var fileDate=[];
            size = 0;
        if(dataArr !=''){
            fileDate = eval("("+dataArr+")");  //string 类型转为 数组类型
            size = fileDate.length ;
        }

        console.log(fileDate);
        console.log("size:"+size);

        jsondata.id = new Date().getTime(); //序号,唯一标识

        
        fileDate[size] = jsondata;
        urlstr = JSON.stringify(fileDate);

        fs.writeFile(FileJson,urlstr,{flag:'w',encoding:'utf-8',mode:'0666'},function(err){
             if(err){
                 console.log("文件内容添加写入失败!")
             }else{
                 console.log("文件内容添加写入成功!");
             }
        }) 
    });
    request.addListener("end",function(){
        console.log('添加成功!');
        response.writeHead(301,{ 'Location':'/' }); //重定向
        response.end();
    });
}

/**修改方法,显示数据项。将数据返回到页面
 * @param {[type]} request  
 * @param {[type]} response 
 */
function updateShow(request,response){
    var urlstr = '';
    request.addListener("data",function(postdata){
        urlstr+=postdata;    //接收到的表单数据字符串,这里可以用两种方法将UTF-8编码转换为中文
        var jsondata = qs.parse(urlstr);        //转换成json对象
        var id = jsondata.id;//前台传过来的参数,只有一个id
        console.log("进入修改页面-------"+jsondata.id);
        var dataArr = fs.readFileSync(FileJson,'utf-8') ; //去读文件
        
        var fileDate=[];
            size = 0;
        if(dataArr !=''){
            fileDate = eval("("+dataArr+")");  //string 类型转为 数组类型
            size = fileDate.length ;
        }
        //遍历已有数据,取出需要修改的数据,进行替换
        for (var i = 0; i < size; i++) {
            if(fileDate[i].id==id){
                urlstr = fileDate[i];
                break;
            }
        }
        // console.log(urlstr);
    });
    request.addListener("end",function(){
        response.writeHead(200,{"Content-Type":"text/html; charset=utf-8"});
        response.write(JSON.stringify(urlstr));
        console.log('跳转到修改页面,数据传送成功!');
        response.end();
    });
}

/**修改方法,保存数据
 * @param {[type]} request  
 * @param {[type]} response 
 */
function updateData(request,response){
    console.log('---------------进入修改保存功能---------------');
    var urlstr = '';
    request.addListener("data",function(postdata){
        urlstr += postdata;    //接收到的表单数据字符串,这里可以用两种方法将UTF-8编码转换为中文
        var jsondata = qs.parse(urlstr);        //转换成json对象
        console.log("修改的数据-------"+jsondata.id);
        
        urlstr = setDataJson(jsondata);
        fs.writeFile(FileJson,urlstr,{flag:'w',encoding:'utf-8',mode:'0666'},function(err){
            if(err){
                console.log("文件内容修改写入失败!")
            }else{
                console.log("文件内容修改写入成功!");
            }
        }) 
    });
    request.addListener("end",function(){
        response.writeHead(301,{ 'Location':'/' }); //重定向
        response.end();
    });
}

/**单个数据删除方法,保存数据
 * @param {[type]} request  
 * @param {[type]} response 
 */
function deleteOnly(request,response){
    var urlstr = '';
    request.addListener("data",function(postdata){
        urlstr+=postdata;    //接收到的表单数据字符串,这里可以用两种方法将UTF-8编码转换为中文
        var jsondata = qs.parse(urlstr);        //转换成json对象
        var id = jsondata.id;
        jsondata.updatetime = new Date().Format("yyyy-MM-dd hh:mm:ss");//更新时间

        var dataArr = fs.readFileSync(FileJson,'utf-8') ; 
        
        var fileDate=[];
            size = 0;
        if(dataArr !=''){
            fileDate = eval("("+dataArr+")");  //string 类型转为 数组类型
            size = fileDate.length ;
        }
        console.log(fileDate[0].id);
        console.log("size:"+size);

        //遍历已有数据,取出需要修改的数据,进行单个删除。记住需要break,否则会报错
        for (var i = 0; i < size; i++) {
            if(fileDate[i].id==id){
                fileDate.splice(i,1);
                break;
            }
        }
        console.log(fileDate.length);
        
        urlstr = JSON.stringify(fileDate);

        fs.writeFile(FileJson,urlstr,{flag:'w',encoding:'utf-8',mode:'0666'},function(err){
             if(err){
                 console.log("文件内容删除写入失败!")
             }else{
                 console.log("文件内容删除写入成功!");
             }
        }) 
    });
    request.addListener("end",function(){
       /* response.writeHead(200,{"Content-Type":"text/plain; charset=utf-8"});
        response.write('单个删除成功!');
        response.end();*/
        response.writeHead(301,{ 'Location':'/' }); //重定向
        response.end();
    });
}

/****************************************** 赋值   ******************************/
function setDataJson(jsondata){
    var id = jsondata.id,
        dataArr = fs.readFileSync(FileJson,'utf-8') , //去读文件
        fileDate=[];
        size = 0;
    if(dataArr !=''){ //判断非空
        fileDate = eval("("+dataArr+")");  //string 类型转为 object类型
        size = fileDate.length ;
    }
    
    //遍历已有数据,取出需要修改的数据,进行替换
    for (var i = 0; i < size; i++) {
        //console.log(i+'-------'+fileDate[i].id);
        if(fileDate[i].id==id){
            //console.log(typeof(fileDate[i])+'----'+typeof(jsondata));
            fileDate[i].name =  jsondata.name;
            fileDate[i].url = jsondata.url;
            fileDate[i].businesstype = jsondata.businesstype;
            fileDate[i].language = jsondata.language;
            fileDate[i].datatype = jsondata.datatype;
            fileDate[i].runtype = jsondata.runtype;
            fileDate[i].reason = jsondata.reason;
            fileDate[i].dataauthor = jsondata.dataauthor;
            fileDate[i].opentype = jsondata.opentype;
            fileDate[i].author = jsondata.author;
            fileDate[i].record = jsondata.record;
            fileDate[i].datatime = jsondata.datatime;
            fileDate[i].updatetime = new Date().Format("yyyy-MM-dd hh:mm:ss");//更新时间
            break;
        }
    }

    return JSON.stringify(fileDate);//返回string数据类型
}
/****************************************** 页面跳转相关方法 ****************************************/
/**页面跳转方法
 * @param  {[type]} request  [description]
 * @param  {[type]} response [description]
 * @param  {String} filename 文件名称
 */
function gotoPage(request,response,filename){
    response.writeHead(200,{"Content-Type":"text/html"});
    fs.readFile(filename,"utf-8",function(e,data){
        response.write(data);
        response.end();
    });
}

//获取链接地址
function getFileContent(filepath){
    try{
        return fs.readFileSync(filepath);
    }catch(e){
        console.log('文件不存在:'+filepath);
        return false ;
    }
}

//日期格式化
Date.prototype.Format = function (fmt) { 
    var o = {
        "M+": this.getMonth() + 1, //月份 
        "d+": this.getDate(), //日 
        "h+": this.getHours(), //小时 
        "m+": this.getMinutes(), //分 
        "s+": this.getSeconds(), //秒 
        "q+": Math.floor((this.getMonth() + 3) / 3), //季度 
        "S": this.getMilliseconds() //毫秒 
    };
    if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var k in o)
    if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt;
}

具体见demo

以上文章来自:黄卉 , https://huanghui8030.github.io/node/server.html