GET表单提交
<form action="http://localhost:8087/2.html" method="get">
姓名:<input type="text" name="name" value='aaaa'>
密码:<input type="password" name="pass" value='2222'>
<input type="submit" value='提交'>
</form>
在node开启的服务器中使用req.url即可获得如下数据
/2.html?name=aaaa&pass=2222
使用url模块解析req.url
// let url = url.parse(req.url,true)//解析后获得url对象,加true后解析成JSON
// url.query 可获得数据的JSON
// url.pathname 可获得路径
// 使用解构赋值 let {pathname,query} = url.parse(req.url,true);
POST表单提交
//POST方法传输的数据通常很大,所以我们会把大的数据包切成许多小包.
//因为HTTP基于TCP协议传输数据,可信度极高,所以不需要判断数据正确性.
//此处需要使用querystring模块将接收完整的数据进行parse(解析),成为JSON格式
//querystring的parse只是解析数据的部分,而url的parse是解析整个url.
const qs = require('querystring')
let str;//初级用法,后期优化;
使用req.on('data',data=>{//接收数据包
str+=data;
});
使用req.on('end',()=>{ //表明接收数据完成
qs.parse(str);
});
同时处理get与post请求
const http = require('http');//http模块
const url = require("url");//url模块
const qs = require('querystring');//qs模块
let server = http.createServer((req,res)=>{
//get
let {pathname,query} = url.parse(req.url,true);
//post
let str;//初级用法,后期优化;
req.on('data',data=>{//接收数据包
str+=data;
});
req.on('end',()=>{ //表明接收数据完成
let post = qs.parse(str);
console.log(pathname,query,post)
});
})
server.listen(8087);
数据交互
index.js
const server = require("./server");
const router = require('./router');
const reqHand = require('./requestHandlers');
server.start(router.route);//使用服务器模块的start方法
server.js
// 服务器模块
const http = require('http');//http模块
var url = require("url");//获取路径模块
const qs = require('querystring');
function start(route){
let users={}
function onHttp(req,res){
let {pathname,query} = url.parse(req.url,true);
let str;//初级用法,如果上传了图片等二进制文件,就会出错;所以实际应该用arr[]数组接收数据,然后拼接给Buffer;25号笔记中更新
req.on('data',data=>{//接收数据包
str+=data;
});
req.on('end',()=>{ //表明接收数据完成
let post = qs.parse(str);
console.log(pathname,query,post);
route(pathname,res,query,users)//数据交给路由
});
}
http.createServer(onHttp).listen(8087)//创建服务与监听端口
}
exports.start = start;
router.js
// 路由模块
const fs = require('fs');
function route(pathname,res,query,users){
let{name,pass} = query;
switch(pathname){
case '/reg':
console.log("sssssssss");
if(!name){
res.write('{"err":"1","msg":"name null"}');
}else if(!pass){
res.write('{"err":"1","msg":"pass null"}');
}else if(!/^\w{8,32}$/.test(name)){
res.write('{"err":"1","msg":"name miss"}');
}else if(/^['|"]$/.test(pass)){
res.write('{"err":"1","msg":"pass miss"}');
}else if(users[name]){
res.write('{"err":"1","msg":"name exist"}');
}else {
users[name]=pass;
res.write('{"err":"0","msg":"success"}');
}
res.end();
break;
case '/login':
if(!name){
res.write('{"err":"1","msg":"name null"}');
}else if(!pass){
res.write('{"err":"1","msg":"pass null"}');
}else if(!/^\w{8,32}$/g.test(name)){
res.write('{"err":"1","msg":"name miss"}');
}else if(/^['|"]$/g.test(pass)){
res.write('{"err":"1","msg":"pass miss"}');
}else if(!users[name]){
res.write('{"err":"1","msg":"no this name"}');
}else if(users[name]!=pass){
res.write('{"err":"1","msg":"name or pass is incorrect"}');
}else{
res.write('{"err":"0","msg":"success"}');
}
res.end();
break;
default:
fs.readFile(`www${pathname}`,(err,data)=>{
if(err){
res.writeHeader(404);
res.write('Not Found');
}else{
res.write(data);
}
res.end();//数据完成
});
}
}
exports.route = route;
HTML
<script type="text/javascript">
$(function (){
$('#btn1').click(function (){
$.ajax({
url:'/reg',
data:{name:$("#name").val(),pass:$("#pass").val()},
dataType:'json',
success(data){
if(data.err != 0){
// alert(data.msg)
alert("成功的错"+data.msg);
}else{
alert("成功");
}
},
error(e){
alert(e.error);
}
})
})
})
</script>
</head>
<body>
姓名:<input type="text" id="name" >
密码:<input type="password" id="pass" >
<input type="button" id="btn1" value="注册">
<input type="button" id="btn2" value="登陆">
</body>
数据库
数据库分类
1.关系型数据库 :mysql oracle
mysql 性能,安全性都不错,免费,容灾能力略差
oracle
性能,安全性都不错,收费,容灾能力极好
2.文件型数据库 :sqlite
3.文档型数据库 :MongoDB
扩展
阻塞IO与非阻塞IO
阻塞IO与非阻塞IO的工作效率没有区别,node用的非阻塞IO
非阻塞IO使用回调函数,异步执行.所以程序执行过来的时候不会等待.
阻塞IO,因为程序需要等待回应,所以会导致整个程序卡住.
前端加密后后台再次进行校验
加密解密通常使用RSA算法,RSA为一类算法的统称.
前台加密后,后台解密再校验.
离散数学推荐一本书,蓝皮,同济大学出版.
node 垃圾回收机制(gc)
在没有垃圾回收机制的语言中(c语言),内存需要自己释放,如果忘记释放就会造成内存泄露,泄露太多,(内存被垃圾占满),程序就没办法运行了.
缓冲池
将最近,最长使用的资源(文件,数据),直接留在内存中.
需要研究策略来,提高缓冲命中率
缓冲命中率:用户访问资源的次数与该资源来自缓冲池的次数的比(例如100:30)
比例越高,命中率越高,该缓冲池越好.