【NodeJS】归纳篇(三)Express | 链式操作 | cookie && session

初步使用

第一步

  • npm install express

示例:server.js

  • 1、创建服务
  • 2、监听
  • 3、处理请求
const express = require('express');
var server = express();//1、创建服务
//3、响应请求
//use() 添加响应
server.use('/a.html',function(req,res){
//req和res是经过express封装过的,并非nodejs中原生的
    res.send('abc');//类似于write()
    res.end();
});
server.use('/b.html',function(req,res){
    res.send('cba');//类似于write()
    res.end();
});
server.listen(8080);//2、监听

3种接收用户请求的方法:

  • get(‘/’,function(req,res){});
  • post(‘/’,function(req,res){});
  • use(‘/’,function(req,res){});//都能接收get和post方式的请求

改进

express-static 处理静态文件的中间件

const express = require('express');
const expressStatic = require('express-static');
var server = express();
server.listen(8080);
//接口:get方式: /login?user=xxx&psw=xxx
//返回: {result:true/false,msg:'原因'}
server.get('/login',function(req,res){
    var user = req.query['user'];
    var psw  = req.query['psw'];
    if(users[user]==null){
        res.send({reslut:false,msg:'不存在'});
    }else {
        if(users[user]!=pass){
            res.send({reslut:false,msg:'密码错了'});
        }else{
            res.send({reslut:true,msg:'成功'});
        }
    }
});
server.use(expressStatic('./www'));//从www这个目录下读取静态文件

处理数据

const express = require('express');
const bodyParser = require('body-parser');
var server = express();
server.listen(8080);

server.use(bodyParser.urlencoded({
    extended: false,  //扩展模式,true启用,false普通模式
    limit: 2*1024*1024         //限制,最大支持的POST数据,默认100k
})); //使用多个use()时,会形成一个链式操作(下面会讲到)

//获取Get,Post相关数据
server.use('/',function(req,res){
    console.log(req.query); //获取Get
    console.log(req.body); 
    //获取Post,需要一个中间环节server.use(bodyParser.urlencoded({}));
});

由此可见:

  • Get无需中间件支持
  • POST需要body-parser中间件,先server.use(bodyParser.urlencoded({})); 后req.body

链式操作

从上节中可以看到链式操作,你可以简单理解使用链式操作是规定这个操作流程有一个步骤,即需要先做什么,然后做什么。依次下去形成一个“流水线”

改写示例:

const express = require('express');
const bodyParser = require('body-parser');
var server = express();
server.listen(8080);

server.use('/',function(req,res,next){//注意参数
    console.log(1);
    next();  //**注意,next()是选择性的执行**
});

server.use('/',function(req,res,next){
    console.log(2);
});

注意到,在use()的参数中,多了一个next,这是一个可选操作,即供用户选择是否要下一步操作。

中间件怎么写——原生

const express = require('express');
const querystring = require('querystring');
var server = express();
server.listen(8080);


server.use(function(req,res,next){//没有第一个参数,则对所有路径请求都接收
//原生写法
    var str = '';
    req.on('data',function(data){
        str+=data;
    });
    req.on('end',function(){
        req.body = querystring.parse(str);  //解析字符串
        next();  //**注意next()所在位置**
    });

});
server.use(function(req,res){
    console.log(req.body);
});

改写,将其写成一个模块mybody-parser.js。

const querystring = require('querystring');
modules.exports={//没有第一个参数,则对所有路径请求都接收
    parser:function(){
        return function(req,res,next){
                var str = '';
                req.on('data',function(data){
                    str+=data;
                });
                req.on('end',function(){
                    req.body = querystring.parse(str);  //解析字符串
                    next();  //注意next()所在位置
                });
            };
    };
};

引用mybody-parser.js模块

const express = require('express');
const mybodyParser = require('mybody-parser');
//mybody-parser输出的是一个function,那么mybodyParser就是一个function

var server = express();
server.listen(8080);

server.use(mybodyParser.parser());//使用mybody-parser中间件

server.use(function(req,res){
    console.log(req.body);
});
  • cookie : 在浏览器保存一些数据,每次请求都会带过来
    缺陷:不安全、存储空间有限(4k)

  • session : session是逻辑上的,其还是基于cookie实现,也保存数据,但保存在服务端。
    优点:安全、存储空间依据服务器空间。
    原理:客服端请求服务端,先带一个空的cookie={}传到服务端,然后服务端对这个cookie赋值并写到客户端;下一次客户端向服务端发起请求时,就会带上这个cookie。cookie中会有一个session的ID,服务器利用sesssion的ID找到session文件或读取、写入。
    隐患session劫持

读取与发送cookie

  • 读取——cookie-parser
const express = require('express');
const cookieParser = require('cookie-parser');//引入中间件
var server = express();

//cookie
server.use(cookieParser());

server.use('/',function(req,res){
    res.cookie('user','imaginecode',{path:'/www',maxAge:30*24*36000*1000});
    //maxAge:设置过期时间(有效期),单位毫秒
    //path:指定在该路径下可以读这个cookie 
    //读取cookie
    console.log(req.cookies);

});

server.listen(8080);
  • cookie安全性:cookie签名
const express = require('express');
const cookieParser = require('cookie-parser');//引入中间件
var server = express();

//cookie
server.use(cookieParser('imaginecode0101'));

server.use('/',function(req,res){
    req.secret = 'imaginecode0101';//设置密钥
    res.cookie('user','imaginecode',{signed:true});
    //加入参数signed签名,需要提供密钥secret
    console.log("带签名的cookie",req.signedCookies);
    console.log("无签名的cookie",req.cookies);  
});

server.listen(8080);

注意
cookie空间非常下,要省着用;
安全性差——校验cookie是否被纂改过;

小结

  • res.cookie()//发送cookie
  • 读取cookie:使用到中间件——cookieParser,server.use(cookieParser('密钥'))
  • 用cookie: req.cookies 未签名版,req.signedCookies 带签名
  • 删除cookie: res.clearCookie(cookie名);

  • cookie加密——cookie-encrypter,cookie加密意义不大。

session——cookie-session中间件

1、写入
2、读写

const express = require('express');
const cookieParser = require('cookie-parser');//引入中间件
const cookieSession = require('cookie-session');
var server = express();

//cookie
server.use(cookieParser('imaginecode0101'));
//session
server.use(cookieSession({
    name: 'sess',//session名
    keys = ['aaa','bbb','ccc'],
    //使用session时,需要加keys--密钥,keys为数组,会依次循环使用keys中的密钥对session加密
    //keys密钥数组越长,越安全
    maxAge: 1*3600*1000 //设置有效期1小时
}));

server.use('/',function(req,res){
if(req.session['count']==null){//第一次
    req.session['count']=1;
}else {
    req.session['count']++;
}
        console.log(req.session);//注意session在request上
});

server.listen(8080);

至此,归纳了Express的基础使用。但是,要拿Express具体做些东西的话,这些还不够。下一节会对模板引擎进行归纳。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/ImagineCode/article/details/81674764