首先,这个简单的服务器的功能是实现注册和登录的,还有首页数据的增删查改。
先将这个简单的服务器搭建出来
1. 导入node中的用到内置模块(http,fs,path,url)
let http = require("http"); //协议 let fs = require("fs); //文件系统 let url = require("url"); //地址 let path = require("path"); //路径
2. 创建一个服务
let server = http.createServer();
3. 监听request请求
server.on("request",(req,res) => { ...... //功能的实现 })
4. 选一个端口号,并监听
server.listen(2468); console.log("server running in 2468");
具体的功能:
注册界面:
1. 判断用户输入的用户名是否已经存在
2. 注册,将注册的用户名和密码存储到服务器中
登录界面:
1. 判断用户输入的用户名是否已经存在,如果用户名不存在,就提示用户请注册
2. 登录,判断用户所输入的用户名和密码是否和服务器存储的数据相同
首页界面:
1. 进入首页,将用户相关的数据显示在页面上
2. 添加数据
3. 修改数据,可以是一条数据或者多条数据
4. 删除数据
5. 查找数据,将所有与用户所输入的值有关的数据全都显示在网页上
var http = require("http"); var fs = require("fs"); var querystring = require("querystring"); var url = require("url"); var server = http.createServer(); server.on("request",function(req,res){ var urlobj = url.parse(req.url,true); // console.log(urlobj); var pathname = urlobj.pathname; // console.log(pathname); var query = urlobj.query; // console.log(query); //避免出现跨域问题 res.setHeader("Access-Control-Allow-Origin","*"); res.setHeader("Access-Control-Allow-Methods","DELETE,PUT,POST,GET,OPTIONS"); //接口 //注册用户名失焦验证get请求 else if (pathname == "/register_name" && req.method == "GET" && query.uname) { fs.readFile("./data.json","utf8",function(err,data){ data = JSON.parse(data); console.log(data); var flag_register_name = false; for (var i = 0; i < data.length; i++) { // console.log(data[i].uname); if (query.uname == data[i].uname){ flag_register_name = true; break; } } if (flag_register_name) { res.end("0"); //用户名已经被注册过 }else { res.end("1"); //用户名可以使用 } }) } //用户登录 else if (pathname == "/login" && req.method == "POST"){ var data = ""; req.on("data",function(chunk){ data += chunk; }); req.on("end",function(){ var data_obj = querystring.parse(data); console.log(data_obj); fs.readFile("./data.json","utf8",function(err,data){ data = JSON.parse(data); console.log(data); var flag_login = false; for (var i = 0; i < data.length; i++) { if (data_obj.uname == data[i].uname && data_obj.upassword == data[i].upassword){ flag_login = true; } } if (flag_login){ res.end("1"); //登录成功 }else { res.end("0"); //用户名或密码错误 } }) }) } //用户名注册post请求 else if (pathname == "/register" && req.method == "POST") { var data = ""; req.on("data",function(chunk){ data += chunk; }); req.on("end",function(){ var data_obj_r = querystring.parse(data); console.log(data_obj_r); fs.readFile("./data.json","utf8",function(err,data){ if (data_obj_r.uname && data_obj_r.upassword){ data = JSON.parse(data); //将字符串转化为对象,data是一个数组 data.push(data_obj_r); console.log(data); var data_login = JSON.stringify(data); fs.writeFile("./data.json",data_login,"utf8",function(err){ res.end("1"); //注册成功 }) } else{ res.end("0"); //提交参数错误 } }) }) } //首页获取数据 else if (pathname == "/index_getdata" && req.method == "GET") { console.log(query); fs.access("./data/" + query.uname + ".json",function(err){ if (err){ fs.writeFile("./data/" + query.uname + ".json","[]",function(err){ fs.readFile("./data/" + query.uname + ".json","utf8",function(err,data){ var data_indgd = '{"message":"ok","data":' + data + '}'; res.end(data_indgd); }) }) }else { fs.readFile("./data/" + query.uname + ".json","utf8",function(err,data){ var data_indgd = '{"message":"ok","data":' + data + '}'; res.end(data_indgd); }) } }) } //添加数据 else if (pathname == "/add_data" && req.method == "POST") { // console.log(query.uname); var data = ""; req.on("data",function(chunk){ data += chunk; console.log(data); }); req.on("data",function(){ var data_add = querystring.parse(data); console.log(data_add); fs.readFile("./data/" + data_add.uname + ".json","utf8",function(err,data){ console.log(data); var data_add2 = JSON.parse(data); console.log(data_add2); if (data_add2.length == 0){ var obj = { pid : 0, name : data_add.name, sex : data_add.sex, age : data_add.age, mail : data_add.mail, phone : data_add.phone }; data_add2.push(obj); var obj2 = JSON.stringify(data_add2); // console.log(obj2); fs.writeFile('./data/' + data_add.uname + ".json",obj2,function(err){ res.end('1'); //添加成功 }) }else{ var obj = { pid : data_add2[data_add2.length-1].pid + 1, name : data_add.name, sex : data_add.sex, age : data_add.age, mail : data_add.mail, phone : data_add.phone } data_add2.push(obj); var obj2 = JSON.stringify(data_add2); fs.writeFile('./data/' + data_add.uname + ".json",obj2,function(err){ res.end('1'); //添加成功 }) } }) }) } //删除数据 else if (pathname == "/remove_data" && req.method == "GET"){ console.log(query); fs.readFile('./data/' + query.uname + ".json",'utf8',function(err,data){ var data = JSON.parse(data); console.log(data); for(var i = 0;i < data.length;i++){ if(data[i].pid == query.pid){ break; } } data.splice(i,1); var str = JSON.stringify(data) console.log(str); fs.writeFile('./data/' + query.uname + ".json",str,function(err){ res.end("1"); }) }) } //修改数据 else if (pathname == "/query_data" && req.method == "POST") { var data = ''; req.on("data", function(chunk){ data += chunk; }); req.on('end', function(err){ var revobj = querystring.parse(data); var uname = revobj.uname; var pid = revobj.pid; // console.log(revobj); fs.readFile('./data/' + uname + ".json",'utf8',function(err,data){ var data = JSON.parse(data); for(var i = 0;i < data.length;i++){ if(data[i].pid == pid){ break; } } if(revobj.name){ data[i].name = revobj.name; } if(revobj.sex){ data[i].sex = revobj.sex; } if(revobj.age){ data[i].age = revobj.age; } if(revobj.mail){ data[i].mail = revobj.mail; } if(revobj.phone){ data[i].phone = revobj.phone; } var str = JSON.stringify(data); fs.writeFile('./data/' + uname + ".json",str,function(err){ res.end("1"); }) }) }) } }); server.listen(2468); console.log('server is running in 127.0.0.1:2468');
在首页数据在显示,我用的是笨的方法,在每次操作数据之后,都会进行一次数据的获取,在数据获取前会将之前展示的数据进行清空,然后再将后面获取的数据展示上去。
而且,这个服务器不是很完整,有些bug,但是最基本的几个功能是实现了的。