文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

Express框架Router、Route和Layer对象如何使用

2023-07-05 16:15

关注

今天小编给大家分享一下Express框架Router、Route和Layer对象如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

Layer

Layer 是什么? Express 中最小的存储单元,存储的重要内容包括 handle 也就是 fn、path 等路径。fn 就是中间件处理函数。重要的是 route 中能匹配:

module.exports = Layer;function Layer(path, options, fn) {  if (!(this instanceof Layer)) {    return new Layer(path, options, fn);  }  var opts = options || {};  this.handle = fn;  this.name = fn.name || '<anonymous>';  this.params = undefined;  this.path = undefined;  this.regexp = pathRegexp(path, this.keys = [], opts);  this.regexp.fast_star = path === '*'  this.regexp.fast_slash = path === '/' && opts.end === false}Layer.prototype.handle_error = function handle_error(error, req, res, next) {}Layer.prototype.handle_request = function handle(req, res, next) {}Layer.prototype.match = function match(path) {} // 返回 boolean

看看哪些的内容实例化了 Layer 的构造函数。Layer 的最主要的作用就是,被路由匹配到,然后取出 handle 函数最后调用,消费 handle 函数。

一个 Route 的栈 stack 中,可以存放多个 Layer。

Route.prototype.all = function all() {        var layer = Layer('/', {}, handle);    }Route.prototype[method] = function(){      var layer = Layer('/', {}, handle);   }
proto.route = function route(path) {  // ***  var layer = new Layer(path, {    sensitive: this.caseSensitive,    strict: this.strict,    end: true  }, route.dispatch.bind(route)); // *** this.stack.push(layer);};
proto.use = function use(fn) {     var layer = new Layer(path, {      sensitive: this.caseSensitive,      strict: false,      end: false    }, fn);    this.stack.push(layer);}

在 Router 中的 route 和 use 函数,使用 Layer 构造函数实例化 layer, 然后将 layer 压到 stack 中保存卡里,方便以后匹配。

function matchLayer(layer, path) {  try {    return layer.match(path);  } catch (err) {    return err;  }}

从上面的代码中知道,layer 对象的 match 方法,根据路径进行匹配, match 返回 boolean. 在匹配的时候主要处理了两个属性:

this.params = undefined;this.path = undefined;

接下来看 matchLayer 函数, matchLayer 调用在 Router.handle 函数的 next 函数中。

Route

module.exports = Route;function Route(path) {  this.path = path;  this.stack = [];  this.methods = {};}Route.prototype._handles_method = function _handles_method(method) {}Route.prototype._options = function _options() {}Route.prototype.dispatch = function dispatch(req, res, done) {}Route.prototype.all = function all() {}// 扩展 methods 包中的方法

Router

Router 就是 proto

var proto = module.exports = function(options) {}proto.param = function param(name, fn) {}proto.handle = function handle(req, res, out) {}proto.process_params = function process_params(layer, called, req, res, done) {}proto.use = function use(fn) {}proto.route = function route(path) {}// 扩展 methods + all 上所有的方法

注意: Router.handle 函数.

var stack = self.stack;while (match !== true && idx < stack.length) {}

在 while 循环中,使用 idx 中取出 layer 和 path然后交给 matchLayer 函数, 得到匹配结果。如果调用的内容正常:

layer.handle_request(req, res, next) // 最终会得到中间件的处理函数

接下来盘点, Router/Route/Layer 的常用方法

方法统计

Router 方法说明
Router param参数
Router handle处理函数
Router process_params处理参数
Router use中间件
Router route路由
Router [methods]/all各种方法
Route 方法说明
Route _handles_method私有处理函数
Route _options私有选项
Route dispatch派发请求和响应
Route all各种方法
Route [methods]各种方法
Layer 方法说明
Layer handle_error处理错误
Layer handle_request处理请求
Layer match根据路径匹配路由并返回 boolean

看 Router 和 Route 有相同的方法: all/[methods]。使用 Router.route 的方法通过 path 方法关联。同时 咋 Router.route 中实例化 Layer ,然后将 layer 保存在 Router 的 stack 中。

两个 stack

从上面的分析中,知道了 Router 中有 stack,Route 中也有 stack, 在 stack 中添加内容(也就是 Layer)一般都是与路由和中间件相关。

取出 stack 中 layer

取出 Layer 发生在 Route 的 dispatch 函数 的 next 函数中,此时需要调用 layer 中匹配到的参数。

从 Router 到 layer 的路径

Router.route 方法中的 dispatch

var layer = new Layer(path, {    sensitive: this.caseSensitive,    strict: this.strict,    end: true}, route.dispatch.bind(route));

route.dispatch 在此处 bind 绑定,此时作为 Layer 构造函数的第三个参数,保存为 handle, 最后会被拿出调用。此时就进入了 next 函数调用阶段。

next 函数

next 函数是 Express 中间件的基础,dispatch 函数从 当前的 stack 中拿出 layer 的实际情况调用 layer 不同的方法。

if (layer.method && layer.method !== method) {  next(err)}

当 layer 中的方法或者等于但当前的方法时,调用自己,此时 next 函数发生了递归。否则进入 handle 相关方法处理请求和处理错阶段,此时 next 方法发生了递归调用。

以上就是“Express框架Router、Route和Layer对象如何使用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

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

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

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

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

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

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

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