zoukankan      html  css  js  c++  java
  • 理解express中的中间件

    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 + ' ' + "网站访问人数" + 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/)

  • 相关阅读:
    第五周反向传播算法
    PHP数组排序
    <meta-data>
    Android之Intent
    Fragment生命周期
    前端后台学习笔记汇杂
    IntelliJ IDEA 14.x 与 Tomcat 集成,创建并运行Java Web项目
    用java将excel中数据导入mysql
    幸运观众抽奖
    JTextField
  • 原文地址:https://www.cnblogs.com/luoqian/p/6375531.html
Copyright © 2011-2022 走看看