首先,这个简单的服务器的功能是实现注册和登录的,还有首页数据的增删查改。
先将这个简单的服务器搭建出来
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,但是最基本的几个功能是实现了的。