Open Christian-health opened 6 years ago
nodeJS——服务器
http——协议
request 请求 输入-请求的信息 response 响应 输出-输出的东西
后台
代码:
const http=require('http');
var server=http.createServer(function (request, response){
console.log('有人来了');
});
//监听——等着
//端口-数字
server.listen(8080);
const http=require('http');
var server=http.createServer(function (req, res){
//console.log('有人来了');
res.write("abc");
res.end();
});
//监听——等着
//端口-数字
server.listen(8080);
//http://localhost:8080/
const http=require('http');
var server=http.createServer(function (req, res){
switch(req.url){
case '/1.html':
res.write("111111");
break;
case '/2.html':
res.write("2222");
break;
default:
res.write('404');
break;
}
res.end();
});
//监听——等着
//端口-数字
server.listen(8080);
//http://localhost:8080/
http——模块
文件操作:fs——File System
fs
异步 vs 同步 异步——多个操作可以同时进行,前一次的操作没完事,后一次也能开始 同步——一次一个
readFile(文件名, function (err, data){}) writeFile(文件名, 内容, function (err){})
oBtn.onclick=function (){ alert('a'); };
alert('b');
const fs=require('fs');
//readFile(文件名, 回调函数)
fs.readFile('aaa.txt', function (err, data){
if(err){
console.log('读取失败');
}else{
console.log(data.toString());
}
});
//fs.writeFile
const fs=require('fs');
//writeFile(文件名, 内容, 回调)
fs.writeFile("bbb.txt", "sdafasdwere", function (err){
console.log(err);
});
const fs=require('fs');
//writeFile(文件名, 内容, 回调)
fs.writeFile("bbb.txt", "sdafasdwere", function (err){
console.log(err);
});
const http=require('http');
const fs=require('fs');
var server=http.createServer(function (req, res){
//req.url=>'/index.html'
//读取=>'./www/index.html'
// './www'+req.url
var file_name='./www'+req.url;
fs.readFile(file_name, function (err, data){
if(err){
res.write('404');
}else{
res.write(data);
}
res.end();
});
});
server.listen(8080);
注意res.end()这个函数的位置。
http fs
数据请求—— 前台->form、ajax、jsonp 后台->一样
前台 <-> 后台 http
请求方式: 1.GET 数据在url中 2.POST 数据不在url中
req.url=>"/aaa?user=blue&pass=123456" /aaa user=blue&pass=123456
GET数据解析 1.自己切 2.querystring xxx=xx&xxx=xxx 3.urlLib aaa?xxx=xx&xx=12
urlLib.parse(url, true); pathname query
POST数据
const querystring=require('querystring');
var json=querystring.parse("user=blue&pass=123456&age=18");
console.log(json);
const http=require('http');
const urlLib=require('url');
http.createServer(function (req, res){
var obj=urlLib.parse(req.url, true);
var url=obj.pathname;
var GET=obj.query;
console.log(url, GET);
//req获取前台请求数据
res.write('aaa');
res.end();
}).listen(8081);
obj Url {
protocol: null,
slashes: null,
auth: null,
host: null,
port: null,
hostname: null,
hash: null,
search: '?username=yang&password=xue',
query: { username: 'yang', password: 'xue' },
pathname: '/aaa',
path: '/aaa?username=yang&password=xue',
href: '/aaa?username=yang&password=xue'
}
const urlLib=require('url');
var obj=urlLib.parse("http://www.zhinengshe.com/index?a=12&b=5", true);
console.log(obj.pathname, obj.query);
GET数据: req.url——urlLib.parse(, true)
POST数据接收:POST数据比GET大得多
POST很大——分段 data 一段数据 end 全部到达
req.url => '/aaa?a=12&b=5'
obj={ pathname: '/aaa' query: {a: 12, b: 5} }
const http=require('http');
const fs=require('fs');
const querystring=require('querystring');
const urlLib=require('url');
var server=http.createServer(function (req, res){
//GET
var obj=urlLib.parse(req.url, true);
var url=obj.pathname;
const GET=obj.query;
//POST
var str='';
req.on('data', function (data){
str+=data;
});
req.on('end', function (){
const POST=querystring.parse(str);
/*
url——要什么
GET——get数据
POST——post数据
*/
//文件请求
var file_name='./www'+url;
fs.readFile(file_name, function (err, data){
if(err){
res.write('404');
}else{
res.write(data);
}
res.end();
});
});
});
server.listen(8081);
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<form action="http://localhost:8080" method="post">
<textarea type="text" name="value"></textarea>
<input type="submit" name="提交">
</form>
</body>
</html>
const http=require('http');
const querystring=require('querystring');
http.createServer(function (req, res){
//POST——req
var str=''; //接收数据
//data——有一段数据到达(很多次)
var i=0;
req.on('data', function (data){
console.log(`第${i++}次收到数据`);
str+=data;
});
//end——数据全部到达(一次)
req.on('end', function (){
var POST=querystring.parse(str);
console.log(POST);
});
}).listen(8080);
const http=require('http');
const fs=require('fs');
const querystring=require('querystring');
const urlLib=require('url');
var server=http.createServer(function (req, res){
//GET 因为get请求在url中所以要获取get请求的数据那么就需要解析url
var obj=urlLib.parse(req.url, true);
var url=obj.pathname;
const GET=obj.query;
//POST post请求的数据在请求体中,所以需要用data,end事件中进行处理,需要querystring进行处理
var str='';
req.on('data', function (data){
str+=data;
});
req.on('end', function (){
const POST=querystring.parse(str);
/*
url——要什么
GET——get数据
POST——post数据
*/
//文件请求
var file_name='./www'+url;
fs.readFile(file_name, function (err, data){
if(err){
res.write('404');
}else{
res.write(data);
}
res.end();
});
});
});
server.listen(8081);
http/fs/get/post
用户注册、登录
接口: /user?act=reg&user=aaa&pass=123456 {"ok": false, "msg": "原因"}
/user?act=login&user=aaa&pass=123456 {"ok": true, "msg": "原因"}
对文件访问: http://localhost:8080/1.html http://localhost:8080/ajax.js http://localhost:8080/1.jpg
对接口访问: http://localhost:8080/user?act=xx... http://localhost:8080/news?act=xxx...
http是无状态的,所以不想每次登陆,就产生cookie。
cookie保存在客户端
session保存在服务器端
express: 1.数据 2.中间件
http-无状态的
cookie、session
cookie:在浏览器保存一些数据,每次请求都会带过来 *不安全、有限(4K)
session:保存数据,保存在服务端 *安全、无限
session:基于cookie实现的,session不可能独立存在,没有cookie就没有session *cookie中会有一个session的ID,服务器利用sessionid找到session文件、读取、写入
隐患:session劫持,就是因为cookie中有sessionid那么我拿着你的sessionid就可以访问你的数据
session是不能独立存在的,是依赖于cookie的。
cookie 1.读取——cookie-parser 2.发送——
session cookie-session
cookie: cookie的缺点: 1.cookie空间非常小——省着用 2.安全性非常差 使用cookie时候采取的措施: 1.精打细算 2.校验cookie是否被篡改过
a.发送cookie res.secret='字符串'; res.cookie(名字, 值, {path: '/', maxAge: 毫秒, signed: true});
b.读取cookie cookie-parser
server.use(cookieParser('秘钥')); //用来进行签名
server.use(function (){ req.cookies 未签名版 req.signedCookies 签名版 });
注意这是签名而不是加密 ##【注意签名和加密的区别,签名就是为了保持完整性不被篡改,当你篡改的时候我能看的出来,而加密是加密】
c.删除cookie res.clearCookie(名字);
cookie-parser 这个东西是用来进行签名放置篡改 cookie-encrypter 这个东西用来进行cookie的加密
session: cookie-session
1.写入 2.读取
session劫持
cookie-session
server.use(cookieParser()); server.use(cookieSession({ keys: [.., .., .., ..] }));
server.use('/', function (){ req.session });
delete req.session
sessionId没有变,但是session.sig改变了
1.cookie-存在浏览器,4K,不安全 签名、加密
2.session-存在服务器 不能独立存在,基于cookie
server.use(cookieParser('签名字符串')); server.use(cookieSession({
}));
server.use(function (req, res){ res.cookie(名字, 值, {signed: true});
res.cookies['user']
res.clearCookie('名字');
res.session['xxx']
delete res.session['xxx'];
});
server1.js
const express=require('express');
var server=express();
//cookie
server.use('/aaa/a.html', function (req, res){
res.cookie('user', 'blue', {path: '/aaa', maxAge: 30*24*3600*1000});
res.send('ok');
});
server.listen(8080);
server2.js
const express=require('express');
const cookieParser=require('cookie-parser');
var server=express();
//cookie
server.use(cookieParser());
server.use('/', function (req, res){
console.log(req.cookies);
res.send('ok');
});
server.listen(8080);
server3.js
const express=require('express');
const cookieParser=require('cookie-parser');
var server=express();
//cookie
server.use(cookieParser('wesdfw4r34tf'));//解析cookie时候使用的秘钥
server.use('/', function (req, res){
req.secret='wesdfw4r34tf';//设置cookie签名时候使用的秘钥
res.cookie('user', 'blue', {signed: true});
//这里的cookie是签名的,cookie签名的作用就是为了保持cookie的完整性,防止被篡改
console.log('签名cookie:', req.signedCookies)
//注意有些cookie是签名的,比如重要的,有些cookie是不签名的因为cookie的大小是有限制的,所以不会对所有的cookie都进行签名
console.log('无签名cookie:', req.cookies);
res.send('ok');
});
server.listen(8080);
server4.js
const express=require('express');
const cookieParser=require('cookie-parser');
var server=express();
//cookie
server.use(cookieParser('wesdfw4r34tf'));
server.use('/', function (req, res){
res.clearCookie('user');
res.send('ok');
});
server.listen(8080);
server5.js
const express=require('express');
const cookieParser=require('cookie-parser');
const cookieSession=require('cookie-session');
var server=express();
//cookie
server.use(cookieParser());
//cookieSession放置到cookieParser之后,因为先要解析出来,然后才可以使用里面的sessionid
server.use(cookieSession({
keys: ['aaa', 'bbb', 'ccc']
}));
server.use('/', function (req, res){
console.log(req.session);
res.send('ok');
});
server.listen(8080);
const express=require('express');
const cookieParser=require('cookie-parser');
const cookieSession=require('cookie-session');
var server=express();
//cookie
server.use(cookieParser());
server.use(cookieSession({
name: 'sess',
keys: ['aaa', 'bbb', 'ccc'],
maxAge: 2*3600*1000//session也有一个过期时间,通过这个过期时间,可以放置用户有无限的时间来破解你的session
//这个maxage时间越来,用户用起来越舒服,不会存在那种,一段时间不用,然后显示已经过期了。
//但是这样也给黑客攻击和破解你的时间
//session不是物理上的东西而是逻辑上的东西。因为session本质就是cookie存放了一个sessionid而已,通过这个id获取用户信息
}));
server.use('/', function (req, res){
if(req.session['count']==null){
req.session['count']=1;
}else{
req.session['count']++;
}
console.log(req.session['count']);
res.send('ok');
});
server.listen(8080);
server7
const express=require('express');
const cookieParser=require('cookie-parser');
const cookieSession=require('cookie-session');
var server=express();
//cookie
var arr=[];
for(var i=0;i<100000;i++){
arr.push('sig_'+Math.random());
}
server.use(cookieParser());
server.use(cookieSession({
name: 'sess',
keys: arr,
maxAge: 2*3600*1000
}));
server.use('/', function (req, res){
if(req.session['count']==null){
req.session['count']=1;
}else{
req.session['count']++;
}
console.log(req.session['count']);
res.send('ok');
});
server.listen(8080);
express整合
body-parser 这个是用来解析post的body体 multer 这个用来进行上传文件解析的
模板引擎
express 模板引擎
consolidate-适配 (这个单词的意思是整合)
模板引擎:适配 1.consolidate
consolidate=require
server.set('view engine', 'html'); server.set('views', '模板文件目录'); server.engine('html', consolidate.ejs);
server.get('/', function (req, res){ res.render('模板文件', 数据); });
route-路由: 把不同的目录,对应到不同的模块
xxxx.com/aaa/ mod1 xxxx.com/news/ mod_news post news_post list news_list content news_content xxxx.com/user/ mod_users
server.get(); server.use() server.post()
Router——迷你server router.get(); router.post(); router.use();
Router——拆 /user/.... mod_user /item/.... mod_item
//1.创建router var router=express.Router();
//2.把router添加到server server.use('/user', router);
//3.router内部 router.get('/1.html') router.post('/2.html')
consolidate
server.set('view engine', 'html'); server.set('views', '模板目录'); server.engine('html', consolidate.ejs);
server.use(function (req, res){ res.render('模板文件', 数据); });
Router——子服务
var router1=express.Router(); server.use('/user', router1);
var r=express.Router(); router1.use('/user_mod', r); router1.use('/user_reg', function (){}); http://www.xxxx.com/user/user_mod http://www.xxxx.com/user/user_reg http://www.xxxx.com/user/user_login
var router2=express.Router(); server.use('/news', router2); http://www.xxxx.com/news/list http://www.xxxx.com/news/post http://www.xxxx.com/news/content
var router3=express.Router(); server.use('/item', router3); http://www.xxxx.com/item/buy http://www.xxxx.com/item/mod http://www.xxxx.com/item/del
第一课
NodeJS——后台 JavaScript-前台
NodeJS-
后台语言:
1.PHP 2.Java 3.Python
优势
1.性能 nodejs php nodeJs比php性能好约86倍
2.跟前台JS配合方便
3.NodeJS便于前端学习
https://nodejs.org/
NodeJS也是JS
1.切换盘符 e: 2.改变目录 cd 目录名 3.执行程序 node xxx.js
JS能用的,NodeJS都能用
代码如下: 1、
console.log('asdfsd');
2、
var oDate=new Date(); console.log(oDate.getFullYear());
3、var re=/\d+/g; console.log("sdf343 34534ree r5345345g 345".match(re));
语法: /正则表达式主体/修饰符(可选)正则表达式模式: 元字符 | 描述 \d | 查找数字。
量词 | 描述 n+ | 匹配任何包含至少一个 n 的字符串。