简介

中间件机制可以让我们在一个给定的流程中添加一个处理步骤,从而对这个流程的输入或者输出产生影响,或者产生一些中作用、状态,或者拦截这个流程。中间件机制和tomcat的过滤器类似,这两者都属于责任链模式的具体实现。
express 中间件使用案例
let express = require('express')
let app = express()
//解析request 的body
app.use(bodyParser.json())
//解析 cookie
app.use(cookieParser())
//拦截
app.get('/hello', function (req, res) {
res.send('Hello World!');
});
模拟中间件机制并且模拟实现解析request的中间件
首先模拟一个request
request = { //模拟的request
requestLine: 'POST /iven_ HTTP/1.1',
headers: 'Host:www.baidu.com\r\nCookie:BAIDUID=E063E9B2690116090FE24E01ACDDF4AD:FG=1;BD_HOME=0',
requestBody: 'key1=value1&key2=value2&key3=value3',
}
一个http请求分为请求行、请求头、和请求体,这三者之间通过\r\n\r\n即一个空行来分割,这里假设已经将这三者分开,requestLine(请求行)中有方法类型,请求url,http版本号,这三者通过空格来区分,headers(请求头)中的各部分通过\r\n来分割,requestBody(请求体)中通过 & 来区分参数
模拟中间件机制
约定 中间件一定是一个函数并且接受 request, response, next三个参数
function App() {
if (!(this instanceof App))
return new App();
this.init();
}
App.prototype = {
constructor: App,
init: function() {
this.request = { //模拟的request
requestLine: 'POST /iven_ HTTP/1.1',
headers: 'Host:www.baidu.com\r\nCookie:BAIDUID=E063E9B2690116090FE24E01ACDDF4AD:FG=1;BD_HOME=0',
requestBody: 'key1=value1&key2=value2&key3=value3',
};
this.response = {}; //模拟的response
this.chain = []; //存放中间件的一个数组
this.index = 0; //当前执行的中间件在chain中的位置
},
use: function(handle) { //这里默认 handle 是函数,并且这里不做判断
this.chain.push(handle);
},
next: function() { //当调用next时执行index所指向的中间件
if (this.index >= this.chain.length)
return;
let middleware = this.chain[this.index];
this.index++;
middleware(this.request, this.response, this.next.bind(this));
},
}
对 request 处理的中间件
function lineParser(req, res, next) {
let items = req.requestLine.split(' ');
req.methond = items[0];
req.url = items[1];
req.version = items[2];
next(); //执行下一个中间件
}
function headersParser(req, res, next) {
let items = req.headers.split('\r\n');
let header = {}
for(let i in items) {
let item = items[i].split(':');
let key = item[0];
let value = item[1];
header[key] = value;
}
req.header = header;
next(); //执行下一个中间件
}
function bodyParser(req, res, next) {
let bodyStr = req.requestBody;
let body = {};
let items = bodyStr.split('&');
for(let i in items) {
let item = items[i].split('=');
let key = item[0];
let value = item[1];
body[key] = value;
}
req.body = body;
next(); //执行下一个中间件
}
function middleware3(req, res, next) {
console.log('url: '+req.url);
console.log('methond: '+req.methond);
console.log('version: '+req.version);
console.log(req.body);
console.log(req.header);
next(); //执行下一个中间件
}
测试代码
let app = App(); app.use(lineParser); app.use(headersParser); app.use(bodyParser); app.use(middleware3); app.next();
整体代码
function App() {
if (!(this instanceof App))
return new App();
this.init();
}
App.prototype = {
constructor: App,
init: function() {
this.request = { //模拟的request
requestLine: 'POST /iven_ HTTP/1.1',
headers: 'Host:www.baidu.com\r\nCookie:BAIDUID=E063E9B2690116090FE24E01ACDDF4AD:FG=1;BD_HOME=0',
requestBody: 'key1=value1&key2=value2&key3=value3',
};
this.response = {}; //模拟的response
this.chain = []; //存放中间件的一个数组
this.index = 0; //当前执行的中间件在chain中的位置
},
use: function(handle) { //这里默认 handle 是函数,并且这里不做判断
this.chain.push(handle);
},
next: function() { //当调用next时执行index所指向的中间件
if (this.index >= this.chain.length)
return;
let middleware = this.chain[this.index];
this.index++;
middleware(this.request, this.response, this.next.bind(this));
},
}
function lineParser(req, res, next) {
let items = req.requestLine.split(' ');
req.methond = items[0];
req.url = items[1];
req.version = items[2];
next(); //执行下一个中间件
}
function headersParser(req, res, next) {
let items = req.headers.split('\r\n');
let header = {}
for(let i in items) {
let item = items[i].split(':');
let key = item[0];
let value = item[1];
header[key] = value;
}
req.header = header;
next(); //执行下一个中间件
}
function bodyParser(req, res, next) {
let bodyStr = req.requestBody;
let body = {};
let items = bodyStr.split('&');
for(let i in items) {
let item = items[i].split('=');
let key = item[0];
let value = item[1];
body[key] = value;
}
req.body = body;
next(); //执行下一个中间件
}
function middleware3(req, res, next) {
console.log('url: '+req.url);
console.log('methond: '+req.methond);
console.log('version: '+req.version);
console.log(req.body);
console.log(req.header);
next(); //执行下一个中间件
}
let app = App();
app.use(lineParser);
app.use(headersParser);
app.use(bodyParser);
app.use(middleware3);
app.next();
运行结果
将以上整体代码运行后将打印以下信息
url: /iven_
methond: POST
version: HTTP/1.1
{key1: "value1", key2: "value2", key3: "value3"}
{Host: "www.baidu.com", Cookie: "BAIDUID=E063E9B2690116090FE24E01ACDDF4AD"}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# express
# 中间件
# 中间件原理
# 浅谈express.js框架中间件(middleware)
# express.js中间件说明详解
# express文件上传中间件Multer详解
# express的中间件cookieParser详解
# express的中间件bodyParser详解
# JavaScript 实现类似Express的中间件系统(实例详解)
# 下一
# 这三
# 不做
# 是一个
# 让我们
# 中有
# 后将
# 而对
# 大家多多
# 这两者
# 各部分
# tomcat
# headers
# POST
# requestLine
# HTTP
# br
# E063E9B2690116090FE24E01ACDDF4AD
# BAIDUID
# BD_HOME
相关文章:
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
家庭服务器如何搭建个人网站?
如何获取开源自助建站系统免费下载链接?
制作旅游网站html,怎样注册旅游网站?
如何挑选优质建站一级代理提升网站排名?
,如何利用word制作宣传手册?
专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?
网站制作软件有哪些,制图软件有哪些?
TestNG的testng.xml配置文件怎么写
定制建站价位费用解析与套餐推荐全攻略
网站制作大概多少钱一个,做一个平台网站大概多少钱?
如何高效完成自助建站业务培训?
深圳网站制作培训,深圳哪些招聘网站比较好?
c++ stringstream用法详解_c++字符串与数字转换利器
成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?
全景视频制作网站有哪些,全景图怎么做成网页?
C#怎么使用委托和事件 C# delegate与event编程方法
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
建站之星×万网:智能建站系统+自助建站平台一键生成
,巨量百应是干嘛的?
网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?
如何快速搭建高效香港服务器网站?
成都响应式网站开发,dw怎么把手机适应页面变成网页?
广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?
电商网站制作价格怎么算,网上拍卖流程以及规则?
沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?
内部网站制作流程,如何建立公司内部网站?
C#如何序列化对象为XML XmlSerializer用法
西安专业网站制作公司有哪些,陕西省建行官方网站?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
免费网站制作appp,免费制作app哪个平台好?
如何选择服务器才能高效搭建专属网站?
如何通过VPS建站实现广告与增值服务盈利?
php json中文编码为null的解决办法
常州企业建站如何选择最佳模板?
青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?
黑客如何通过漏洞一步步攻陷网站服务器?
广州美橙建站如何快速搭建多端合一网站?
如何通过FTP空间快速搭建安全高效网站?
如何在腾讯云服务器上快速搭建个人网站?
济南专业网站制作公司,济南信息工程学校怎么样?
Android自定义控件实现温度旋转按钮效果
长沙企业网站制作哪家好,长沙水业集团官方网站?
建站之星Pro快速搭建教程:模板选择与功能配置指南
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
如何零成本快速生成个人自助网站?
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
网站好制作吗知乎,网站开发好学吗?有什么技巧?
如何通过VPS建站无需域名直接访问?
建站之星伪静态规则如何设置?
*请认真填写需求信息,我们会在24小时内与您取得联系。