前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Express中间件的使用、原理及实现

Express中间件的使用、原理及实现

作者头像
挥刀北上
发布2019-07-19 15:15:07
3.2K0
发布2019-07-19 15:15:07
举报
文章被收录于专栏:Node.js开发

现在在一些企业里用nodejs做服务端开发已经很普遍了,这里面最火的框架当然要数express了,express将nodejs原生的支持的http模块进行了简单封装,使开发者使用起来得心应手。

这其中最方便的便是express的中间件机制了。在介绍express的中间件的原理和实现之前咱们先看一下express中间件如何使用。

express的中间件机制类似一个漏斗装置,一个请求到达服务端后,这个请求会被抽象成一个req对象,这个对象会一次进入中间件,在中间件中分别被处理,最后被路由处理函数分发。

如图:

代码演示如图:

之后启动这个express服务,不论访问根路径 "/"还是"/a",中间件都会被执行,这说明每次请求这个服务,中间件都会被逐一执行。

那这样做的目的是什么呢?咱们来实现一个需求,需要计算整个网站的pv,也就是整个网站被客户端请求了多杀次,如果不用中间件会如何做呢?看代码:

如果使用了中间件呢?再看如下代码:

仔细看一下这两份代码的区别,第二份明显简洁了好多,将计算访问量的代码放到中间件中,不需要再在各个路由中分写再去写了,提高了复用性,逻辑表达更清晰,易于维护,以上便是express中间件的使用了,这里需要注意的是,中间件的调用顺序是从上到下,每个中间件调用完成后必须调用next。

那么中间件机制的原理是什么呢,是如何实现的呢?

看下面一段代码:

代码语言:javascript
复制
var http = require('http');

function express() {

    var funcs = []; // 待执行的函数数组

    var app = function (req, res) {
        var i = 0;

        function next() {
            var task = funcs[i++];  // 取出函数数组里的下一个函数
            if (!task) {    // 如果函数不存在,return
                return;
            }
            task(req, res, next);   // 否则,执行下一个函数
        }

        next();
    }

    app.use = function (task) {
        funcs.push(task);
    }

    return app;    // 返回实例
}

var app = express();

function middlewareA(req, res, next) {
    console.log('中间件1');
    next();
}

function middlewareB(req, res, next) {
    console.log('中间件2');
    next();
}

function middlewareC(req, res, next) {
    console.log('中间件3');
    next();
}
app.use(middlewareA);
app.use(middlewareB);
app.use(middlewareC);

http.createServer(app).listen('3000', function () {
    console.log('listening 3000....');
});

以上代码便是express实现中间件机制的核心代码。

简单来说,有如下几点:

  1. express函数调用返回一个app实例
  2. 在express函数内部定义一个数组来存储中间件函数
  3. 在express函数内部定义一个app函数
  4. 在app函数的内部定义一个变量i保存执行的中间件的位置。
  5. 在app函数中定义一个next方法,这个方法通过i值自增调用中间件
  6. 在app函数内部调用next
  7. 在app函数上定义一个use方法,这个方法可以将中间件函数push进中间件数组中。

这样的话,express中间件的调用过程其实就是一个非常多的函数嵌套,形似如下代码:

中间件越多嵌套的层级越多。

以上便是express中间件的简单实现与原理。希望大家跟着文章中的代码敲一遍,有问题或者其他想法可以留言。

每天进步一点点,大家共勉。本公众号,十一期间不打烊。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-10-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 nodejs全栈开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档