nodejs express实现中间件

 更新时间:2022年10月14日 10:42:21   作者:南方小菜  
这篇文章主要为大家介绍了nodejs express实现中间件实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

先看应用

应用规则:

  • express 中 use 的第一个参数是匹配路径 不传相当于"/"
  • 中间件匹配机制是惰性匹配,即匹配路径为/a的中间件,访问/aa时同样会被执行(这也意味着不传匹配路径时即所有请求都会应用此中间件)
const express = require("./express");
const app = express();
// 第一个参数是匹配路径 不传相当于"/"
app.use(function (req, res, next) {
  req.a = 1;
  next();
});
app.use("/", function (req, res, next) {
  req.a++;
  next();
});
app.get("/", function (req, res, next) {
  res.end(req.a + "");
});
app.use("/a", function (req, res, next) {
  req.a++;
  next();
});
app.get("/a", function (req, res, next) {
  res.end(req.a + "");
});
app.listen(3000);

实现思路

结合之前的路由实现,其实中间件就是【没有路由表】的 Layer,我们只需要

  • 订阅监听时做下对“不传匹配路径”等情况的处理
  • 请求发布时根据“是否具有路由表route属性”进行判断从而对中间件区分处理

如此即可

具体实现

订阅监听时做下对“不传匹配路径”等情况的处理

定义use方法

Router.prototype.use = function (path, ...handlers) {
  if (!handlers[0]) {
    // 只传递了一个函数
    handlers.push(path); // app.use(function(){})  app.use()
    path = "/";
  }
  handlers.forEach((handler) => {
    let layer = new Layer(path, handler);
    layer.route = undefined; // 不写也是 undefined , 主要告诉你 中间件没有 route
    this.stack.push(layer);
  });
};

请求发布时根据“是否具有路由表route属性”进行判断从而对中间件区分处理

改写handle方法

Router.prototype.handle = function (req, res, done) {
  let { pathname } = url.parse(req.url);
  let method = req.method.toLowerCase();
  let idx = 0;
  const next = (err) => {
    // 中间件 和内部的 next 方法 出错都会走这个 next
    if (idx >= this.stack.length) return done(); // 路由处理不了 传递给应用层
    let layer = this.stack[idx++];
    // 无论是路由还是中间件 前提是路径必须匹配
    if (layer.match(pathname)) {
      // match 还没有更改
      if (!layer.route) {
        // 没有说明是中间件   注意 此处就是对中间件的区分处理
        layer.handle_request(req, res, next); // 直接执行中间件函数
      } else {
        // 路由必须匹配方法
        if (layer.route.methods[method]) {
          // 这个 next 可以让路由层扫描下一个 layer
          layer.handle_request(req, res, next); // route.dispatch
        } else {
          next();
        }
      }
    } else {
      next();
    }
  };
  next(); // 请求来了取出第一个执行
};

总结流程

以上就是nodejs express实现中间件的详细内容,更多关于nodejs express中间件的资料请关注脚本之家其它相关文章!

相关文章

  • 关于node使用multer进行文件的上传与下载

    关于node使用multer进行文件的上传与下载

    这篇文章主要介绍了关于node使用multer进行文件的上传与下载,Multer是一个Node.js中间件,用于处理表单数据中的multipart/form-data类型,需要的朋友可以参考下
    2023-04-04
  • 基于node的tcp客户端和服务端的简单通信

    基于node的tcp客户端和服务端的简单通信

    通过Nodejs,我们可以快速地搭建一个简单的Web服务器,实现服务端与客户端的简单通信,本文主要介绍了基于node的tcp客户端和服务端的简单通信,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 详解Node 定时器

    详解Node 定时器

    这篇文章主要介绍了Node 定时器的相关知识,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-02-02
  • node.js中实现kindEditor图片上传功能的方法教程

    node.js中实现kindEditor图片上传功能的方法教程

    最近在做一个类似于论坛的系统,帖子需要进行图文并茂的显示,所以用到了富文本编辑器:kindeditor,下面这篇文章主要给大家介绍了在node.js中实现kindEditor图片上传功能的方法教程,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-04-04
  • electron demo项目npm install安装失败的解决方法

    electron demo项目npm install安装失败的解决方法

    下面小编就为大家分享一篇electron demo项目npm install安装失败的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • 深入理解nodejs搭建静态服务器(实现命令行)

    深入理解nodejs搭建静态服务器(实现命令行)

    这篇文章主要介绍了深入理解nodejs搭建静态服务器(实现命令行),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • Node.js中的npm单独与批量升级依赖包的方式超详细讲解

    Node.js中的npm单独与批量升级依赖包的方式超详细讲解

    npm outdated仅检查所有已安装包的依赖关系,并将当前版本远程仓库中的最新版本进行对比,不会升级,这篇文章主要介绍了Node.js中的npm单独与批量升级依赖包的方式超详细讲解,需要的朋友可以参考下
    2024-02-02
  • 充分发挥Node.js程序性能的一些方法介绍

    充分发挥Node.js程序性能的一些方法介绍

    这篇文章主要介绍了充分发挥Node.js程序性能的一些方法介绍,Node.js是把JavaScript用于服务器端的框架,需要的朋友可以参考下
    2015-06-06
  • package.json文件配置详解

    package.json文件配置详解

    这篇文章主要介绍了package.json文件配置详解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-06-06
  • NodeJS学习笔记之Module的简介

    NodeJS学习笔记之Module的简介

    模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的C/C++ 扩展。
    2017-03-03

最新评论