文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

nodejs express实现中间件

2022-11-13 18:23

关注

先看应用

应用规则:

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,我们只需要

如此即可

具体实现

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

定义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中间件的资料请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯