Christian-health / NodeJs-

0 stars 0 forks source link

石川老师NodeJS课程学习笔记 #1

Open Christian-health opened 6 years ago

Christian-health commented 6 years ago

第一课

NodeJS——后台 JavaScript-前台

NodeJS-

后台语言:

1.PHP 2.Java 3.Python

优势

1.性能 nodejs php nodeJs比php性能好约86倍

1s  1分半

PHP 200台    400万
NodeJS  3台  6万

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 的字符串。

Christian-health commented 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/
Christian-health commented 6 years ago

第三课

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()这个函数的位置。

Christian-health commented 6 years ago

第四课

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);
Christian-health commented 6 years ago

第五课

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);
Christian-health commented 6 years ago

第六课

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...

Christian-health commented 6 years ago

第六课

Christian-health commented 6 years ago

第七课

Christian-health commented 6 years ago

第八课

Christian-health commented 6 years ago

第九课

Christian-health commented 6 years ago

第十课

Christian-health commented 6 years ago

第十一课

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的。 2018610741145


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改变了 20186105756312


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);
Christian-health commented 6 years ago

第十二课

Christian-health commented 6 years ago

第十三课

Christian-health commented 6 years ago

第十四课

Christian-health commented 6 years ago

第十五课

Christian-health commented 6 years ago

第十六课

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


Christian-health commented 6 years ago

第十七课

Christian-health commented 6 years ago

第十八课