express是轻量灵活的node.js Web应用框架”。它可以帮助你快速搭建web应用。express是一个自身功能极简,完全是由**路由**和**中间件**构成的一个web开发框架,本质上说,一个express应用就是在调用各种中间件。路由想必大家都有一定的理解,比较陌生的是中间件。那么什么是中间件呢?我在查阅了资料之后把自己的理解分享出来,和大家交流。

##### 一、中间件是什么?
中间件(MiddleWare)可以理解为一个对用户请求进行过滤和预处理的东西,它一般不会直接对客户端进行响应,而是将处理之后的结果传递下去。其实它就是相当于一个过滤器类似于javeEE中的`filter`。
其实,express中的中间件是使用了Connect中间件框架。(Connect是一个中间件框架它的作者与express的作者是同一个人)在3.0的版本中express是包含了Connect的中间件,而在最新的4.0版本中express不再依赖Connect,而且从内核中移除了除`express.static`外的所有内置中间件。也就是说现有的express是一个独立的路由和中间件web框架,express的版本升级不再受中间件更新的影响。如果你需要这些中间件需要显示的添加。步骤如下:
1、 安装模块:npm install --save <module-name>
2、 在应用中引入模块:require('module-name')
3、 按照文档的描述使用模块:app.use( ... )
更多中间件请查阅官方文档: [中间件](http://www.expressjs.com.cn/guide/migrating-4.html)

##### 二、中间件分类
我们可以将根据中间件在整个http处理流程的位置将Connect中间件分为三大类方便记忆。
1、 **pre-request** 通常用来该项request的原始数据
2、 **request、response**大部分中间件都在这里,功能各异。
3、 post-response全局异常处理,改写response数据等

![网友luics的分类](//upload-images.jianshu.io/upload_images/2070541-f8d7d4ff47615e7e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

##### 三、使用中间件有什么好处?
由于我们知道在用原生node api进行`http`请求的处理时要求引入许多模块类似于`url`、`fs`等。并且在对`http`请求做处理时需要很多重复且不是逻辑上的操作,所以就会出现已经帮你封装好的处理操作,让你不再耗费时间在数据处理和异常处理上。这样能够大大减少代码量,使得逻辑更加清晰,具有便捷高效的扩展性。

##### 四、了解原理-自己写中间件
最基本的中间件结构如下:
```
function myFunMiddleware(request, response, next) {
    // 对request和response作出相应操作
    // 操作完毕后返回next()即可转入下個中间件
    next();
}
```
接下来写两个中间件:
```
var express = require('express')
var app = express();

// 01
function middle01(req,res,next){
req.name = 'luoqian'
next();
}

//02
function middle02(){
var accessNum = 0;
return function(req,res,next){
accessNum +=1;
req.accessNum = accessNum
next();
}
}

app.use(middle01);
app.use(middle02());

app.get('/',function(req,res){
res.send(req.name + '\n' + "网站访问人数" + req.accessNum);
})
app.listen(3000);
```
在这里写了两个中间件
第一个是为每一个`req`请求添加一个`name`属性
第二个它本身不是中间件实体,当执行它时,会return一个中间件函数,属于一个闭包,它的作用是每次有请求时,都会给`req`请求对象加入一个`accessNum` 属性,这个属性每次都会 +1 。
当我刷新网页八次之后的结果:

![](//upload-images.jianshu.io/upload_images/2070541-c04b3759536d34d3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

参考资料:
[express与Connect简介](http://www.cnblogs.com/luics/archive/2012/11/28/2775206.html)
[深入理解 Express.js](http://blog.jobbole.com/41325/)

理解express中的中间件的更多相关文章

  1. express中的中间件理解

    什么是中间件 中间件是一个可访问请求对象(req)和响应对象(res)的函数,在 Express 应用的请求-响应循环里,下一个内联的中间件通常用变量 next 表示.中间件的功能包括: 执行任何代码 ...

  2. express中的中间件(middleware)、自定义中间件、静态文件中间件、路由中间件

    express文档地址 什么是中间件呢(middleware)?它是谁的中间件呢? 首先我们需要了解到请求和响应, 请求就是客户端发送请求给服务器, 响应就是,服务器根据客户端的请求返回给客户端的数据 ...

  3. [Django高级]理解django中的中间件机制和执行顺序

    原文来自 Understanding Django Middlewares, 这篇文章从整体上介绍了django中中间件定义,作用,和怎么样自己写中间件 –orangleliu. 注:middlewa ...

  4. express中connect-flash中间件的使用

    在学习node的时候,flash是困扰我最久的一个中间件,之前一直都没有很好的理解,这里做一个总结. 参考自:http://yunkus.com/connect-flash-usage/ 什么是fla ...

  5. express-13 中间件

    简介 从概念上讲,中间件是一种功能的封装方式,具体来说就是封装在程序中处理HTTP请求的功能. 中间件是在管道中执行的,在Express程序中,通过调用app.use向管道中插入中间件.(在Expre ...

  6. express中app和router的区别

      var app = express(); var router = express.Router(); 以上二者的区别是什么,什么时候用哪个最合适? 区别看下面的例子: app.js var ex ...

  7. 精华 对express中next函数的一些理解

        关于next主要从三点来进行说明: next的作用是什么? 我们应该在何时使用next? next的内部实现机制是什么? Next的作用 我们在定义express中间件函数的时候都会将第三个参 ...

  8. Express ( MiddleWare/中间件 路由 在 Express 中使用模板引擎 常用API

    A fast, un-opinionated, minimalist web framework for Node.js applications. In general, prefer simply ...

  9. [转] 对express中next函数的一些理解

    最近公司在使用node做前后端分离,采用的web框架是express,所以对express框架进行了深入的了解,前段时间写了篇关于express路由的文章,但是在那篇文章中貌似少了一个很重要的内容,就 ...

随机推荐

  1. $.fn.extend() 问:我来这个世上到底是干嘛的?

    好好好 乖  本宝宝来告诉你  你来是干嘛的啊~ 话不多说 直接上码 当然如下代码是在jquery环境下运行的 HTML JS 完事~~~ 当你点击div元素的时候  你会发现弹出来“我被单击了”这句 ...

  2. 如何查询linux下BIOS信息

    一般可以使用dmidecode命令(还有biosdecode命令可参考),背景知识如下: SMBIOS (System Management BIOS)是主板或系统制造者以标准格式显示产品管理信息所需 ...

  3. 基于UML的中职班主任工作管理系统的分析与设计--文献随笔(二)

    一.基本信息 标题:基于UML的中职班主任工作管理系统的分析与设计 时间:2016 出版源:遵义航天工业学校 关键字:中职学校; 班主任工作管理; UML建模 二.研究背景 问题定义:班主任是一项特殊 ...

  4. MongoDB 官网教程 下载 安装

    官网:https://www.mongodb.com/ Doc:https://docs.mongodb.com/ Manual:https://docs.mongodb.com/manual/ 安装 ...

  5. 多线程安全单例模式学习代码 c++11

    // Singleton.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <mutex> #include & ...

  6. pycharm 2017最新激活码

    BIG3CLIK6F-eyJsaWNlbnNlSWQiOiJCSUczQ0xJSzZGIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiI ...

  7. JavaScript 方法

    对象的定义 var xiaoming = { name: '小明', birth: 1990 }; 是,如果我们给xiaoming绑定一个函数,就可以做更多的事情.比如,写个age()方法,返回xia ...

  8. ModelAndView对象

    ModelAndView属性中两个最重要的属性是model和view. view即视图,保存的是视图信息. model即模型,以<K,V>形式保存模型数据,上图可以看到是MdelMap类型 ...

  9. js-function复制变量值和传递参数

    <title>function复制变量值</title></head><body> <script> var a={ num:10 } // ...

  10. PowerBuilder常用字符串函数

    http://blog.sina.com.cn/s/blog_5995b53d0100a694.html Fill()功能建立一个由指定字符串填充的指定长度的字符串.语法Fill ( chars, n ...