nodeJS启动服务,并完成数据的增删查改,数据存在json文件中
通过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