2.实现Express中间件
Express提供的大部分功能都是通过中间件函数完成,这些中间件函数在Node.js收到 请求的时点 和 发送响应的时点 执行
connect模块提供了中间件框剪
方便在全局或路径级别或为单个路由插入中间件功能
(处理POST请求,提供静态文件服务,实现会话,cookie和身份验证)
1.了解中间件
允许在 接收到请求的时点 及 真正处理请求和发送响应的时点 之间附加功能。
可以用用身份验证,cookie和会话
提供了connect提供的底层中间件支持。
static:允许express服务器以流式处理静态文件的GET请求。express.static()
express-logger:实现格式化的请求记录器跟踪对服务器的请求
basic-auth-connect:提供对基本http身份验证的支持
cookie-parser:从请求读取cookie并在响应中设置cookie
cookie-session:提供基于cookie的会话支持
express-session:提供了会话实现
body-parser:把post请求正文中的JSON数据解析为req.body属性
compression:发给客户端的大响应提供Gzip压缩支持
csurf:提供跨站点请求伪造保护
1.1.全局范围把中间件分配给某个路由:
对所有路由指定中间件 user([path],middleware)(每个中间件组件都有构造函数,返回相应的中间件功能)
var express=require("express");
var bodyParser=require("body-parser");
var app=express();
app.user('/',bodyParser());
通过把一个 单独的路由 放在path参数 后来对其应用body-parser中间件
var express=require('express');
var bodyParser=require('body-parser');
var app=express();
app.get('/parserdRoute',bodyParser(),function(req,res){
res.send('this request was logged');
})
app.get('/otherRoute',function(req,res){
res.send('this request was not logged');
})
添加多个中间件函数
根据需要在全局范围和路由上分配任意多的中间件函数。
var express=require('express');
var bodyParser=require('body-parser');
var cookieParser=require('cookie-parser');
var session=require('cexpression-session');
var app=express();
app.use('/',bodyParser()).
use('/',cookieParser()).
use('/',session());
query中间件:将一个查询字符串从URL转换为JavaScript对象,将其保存为Request对象的query属性。
var express=require('express');
var app=express();
app.get('/',function(req,res){
var id=req.query.score;
console.log(JSON.stringify(req.query));
res.send("done");
})
1.3.提供静态服务
static常用中间件
(可以使用让你直接从磁盘对客户端提供静态文件服务)
static中间件支持不会改变的 javascript,css,images,html
express.static(path,[options])
var express=require("express");
var app=express();
app.use('/',express.static('./'));
app.use('/images',express.static('../images'));
app.listen(8081);
1.4.处理POST正文数据
请求正文的数据可以是各种格式,如POST参数字符串,JSON字符串,或者原始数据。
express的中间件body-parser中间件解析请求中的正文JSON数据,格式化为Request对象的req.body属性
使用body-parser中间件处理在请求正文中的POST参数
(注意:app.use(body-parser())新版node已经废除)
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));//代替
var express=require('express');
var bodyParser=require('body-parser');
var app=express();
// app.use(bodyParser()); //这个已经过时了
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
})); app.get('/',function(req,res){
var response='<form method="POST">'+
'First:<input type="text" name="first"><br>'+
'Last:<input type="text" name="last"><br>'+
'<input type="submit" value="Submit"></form>';
res.send(response);
})
app.post('/',function(req,res){
console.log('111');
var response='<form method="POST">'+
'First:<input type="text" name="first"><br>'+
'Last:<input type="text" name="last"><br>'+
'<input type="submit" value="Submit"></form>'+
'<h1>Hello'+req.body.first+'</h1>'
res.type('html');
res.send(response);
console.log(req.body)
})
app.listen(8082);
1.5.发送和接受cookie
express提供的cookie-parser中间件使得处理cookie很简单。
cookie-parser中间件从一个请求解析cookie,并作为JavaScript对象存储在req.cookies属性中。
res.cookie(name,value,[options])
var express=require('express');
var cookieParser=require('cookie-parser');
var app=express();
app.use(cookieParser());
app.get('/',function(req,res){
console.log(req.cookies);
if(!req.cookies.hasVisited){
res.cookie('hasVisited','1',{
maxAge:60*60*1000,
httpOnly:true,
path:'/'
});
}
res.send("sending cookie");
})
app.listen(8081);
1.6.实现会话
res.cookie()
cookie-seesion被实现时,会被存储为req.session对象。对req.session的修改会跨越来自同一个浏览器的多个请求流动
var express=require('express');
var cookieParser=require('cookie-parser');
var cookieSession=require('cookie-session');
var app=express();
app.use(cookieParser());
app.use(cookieSession({secret:'MAGICALEXPRESSKEY'}));
app.get('/library',function(req,res){
console.log(req.cookies);
if(req.session.restricted){
res.send('You have been in the restricted section'+
req.session.restrictedCount+' times');
}else{
res.send('Welcome to the library');
}
});
app.get('/restricted',function(req,res){
req.session.restricted=true;
console.log("res="+req.session.restrictedCount);
if(!req.session.restrictedCount){
req.session.restrictedCount=1;
}else{
req.session.restrictedCount+=1;
}
res.redirect('/library');
})
app.listen(8081);
1.7.应用基本的HTTP身份验证
HTTP的身份验证使用Authorization标头从浏览器向服务器发送编码后的用户名和密码。
在浏览器中没有储存URL授权信息,浏览器会启动基本的登录对话框,输入用户名和密码。
基本的HTTP身份验证适合需要最低限度验证方法的基本网站。
var basicAuth=require('basic-auth-connect');
express.basicAuth(function(user,pass){})
var express=require('express');
var basicAuth=require('basic-auth-connect');
var app=express();
var auth=basicAuth(function(user,pass){
return(user=='weizai'&&pass=='test');
})
app.get('/library',function(req,res){
res.send('welcome to the library');
})
app.get('/restricted',auth,function(req,res){
res.send('welcome to the restricted section')
});
app.listen(8081);
1.8.实现会话身份验证
基本的HTTP身份验证的主要缺点:证书被存储,登录会一直存在。不安全
更好的方法:实现自己的身份登录验证机制,将其储存在可以随意使之过期的会话中。
express内的session中间件对于实现会话的验证效果很好。session中间件附件一个session对象res.session对象上的调用方法
方法 | 说明 |
regenerate([callback]) | 移除并创建一个词新的req.session对象,让你重置会话 |
destroy([callback]) | 移除req.session对象 |
save([callback]) | 保存会话数据 |
touch([callback]) | 为会话重置maxAge计数 |
cookie | 指定把绘画链接到浏览器的cookie对象 |
2.实现Express中间件的更多相关文章
- Node.js连接Mysql,并把连接集成进Express中间件中
引言 在node.js连接mysql的过程,我们通常有两种连接方法,普通连接和连接池. 这两种方法较为常见,当我们使用express框架时还会选择使用中间express-myconnection,可以 ...
- 1.express中间件的简介
express中间件的意思 1, 中间件是一个模块.在js中,模块意味着函数,所以中间件是一个函数.那么这个函数长什么样子? 这还要从中间件的功能说起,它拦截http 服务器提供的请求和响应对象,执行 ...
- Express中间件的原理及实现
在Node开发中免不了要使用框架,比如express.koa.koa2拿使用的最多的express来举例子开发中肯定会用到很多类似于下面的这种代码 var express = require('exp ...
- vue+webpack+express中间件接口使用
环境:vue 2.9.3; webpack 目的:接口的调用 跨域方式: 1.express中间的使用 2.nginx代理 3.谷歌浏览器跨域设置 -------------------------- ...
- express 中间件
[express 中间件] 中间件(Middleware) 是一个函数,它可以访问请求对象(request object (req)), 响应对象(response object (res)), 和 ...
- express中间件原理 && 实现
一.什么是express中间件? 什么是express中间件呢? 我们肯定都听说过这个词,并且,如果你用过express,那么你就一定用过express中间件,如下: var express = re ...
- Express中间件
一.编写中间件 中间件函数能够访问请求对象(req),响应对象(res),应用程序的请求/响应循环中的下一个中间件函数.下一个中间件函数通常由名为next的变量来表示. 中间件函数可以执行以下任务: ...
- express中间件的理解
参考 :https://blog.csdn.net/huang100qi/article/details/80220012 Express中间件分为三种内置中间件.自定义中间件.第三方中间件 可以与n ...
- 浅析express以及express中间件
一.express: 1.express: Express是什么? Express是基于node.js平台的web应用开发框架: 作用:可以实现快速搭建骨架: 优点:开发web应用更加方便,更加快捷. ...
- Express中间件简单的实现原理
上一篇理解Express的使用之后, 再总结一篇Express中间件的简单实现原理. 我们知道Express中间件就是一个个的函数, 那么怎么让这些函数有序的执行呢? 那就需要我们调用 next 函数 ...
随机推荐
- delphi SQL操作
create表 时不可以有类似Name之类的字段创建,否则报错,即使access数据库中执行正常 insert的字符型字段中不可以有英文单引号 ' 之类的存在,否则报错,可以用#39 代替,减少英 ...
- python 基本数据类型分析
在python中,一切都是对象!对象由类创建而来,对象所拥有的功能都来自于类.在本节中,我们了解一下python基本数据类型对象具有哪些功能,我们平常是怎么使用的. 对于python,一切事物都是对象 ...
- 【转】SPDY协议
SPDY协议 - v3 原文:SPDY Protocol - Draft 3 翻译:邱鹏滔(QQ: 95350530,主页:www.fireflysource.com) 1 概述 HTTP协议的瓶颈在 ...
- Linux查看软件安装路径
Linux中查看某 个软件的安装路径(地址)有时显得非常重要.比如某个文件的快速启动项被删除,或者你要建立快速启动项,或者想删除. 添加安装文件等等,很多地方都要用到查案文件安装路径的命令. 这里给大 ...
- 怎样让Oracle支持中文? 语言_地域.字符集
暂时不涉及数据库业务,但是今天入库的时候中文入库报错,考虑可能是字体不支持,留待备用. 来源:Linux社区 作者:robertkun 语言_地域.字符集SIMPLIFIED CHINESE_CHI ...
- fopen()和fclose()的用法
fopen()和fclose()的用法 1.fopen()函数的用法 fopen函数用于打开文件, 其调用格式为: FILE *fopen(char *filename, *type); fopen( ...
- ZooKeepr日志清理【转】
转自 :@ni掌柜nileader@gmail.com 地址 数据文件管理 默认情况下,ZK的数据文件和事务日志是保存在同一个目录中,建议是将事务日志存储到单独的磁盘上. 1 数据目录 ZK的数据目录 ...
- CSS样式表继承详解
最近在恶补css样式表的基础知识.上次研究了css样式表之冲突问题详解 .这次是对 css 继承 特性的学习. 什么是css 继承?要想了解css样式表的继承,我们先从文档树(HTML DOM)开始. ...
- BufferedReader readLine()方法
控制台输入字符串之后回车,后台接收传来的字符串,代码如下: import java.io.BufferedReader; import java.io.IOException; import java ...
- HTML5音乐播放器(最新升级改造加强版)
最近么,单位里面么老不顺心的,公司一直催要程序员要PHP,然后本宅好不容易推荐了一个,我日嘞,最后待遇变成1.3,吾师最后也同意1.3W,然后还说要考虑... 尼玛,4年多5年不到一点的工作经验,前端 ...