对express中next函数的一些理解

本文详细探讨了Express框架中next函数的作用、使用时机及其内部机制。next主要负责将控制权传递给下一个中间件,确保请求的正常流程。在终结请求后不应再调用next,否则可能导致异常。通过阅读源码,解析了next如何根据路由匹配执行中间件,以及next(err)如何触发错误处理中间件。同时提到了路由中间件与非路由中间件中next的差异。
摘要由CSDN通过智能技术生成

关于next主要从三点来进行说明:

  1. next的作用是什么?
  2. 我们应该在何时使用next?
  3. next的内部实现机制是什么?

Next的作用

我们在定义express中间件函数的时候都会将第三个参数定义为next,这个next就是我们今天的主角,next函数主要负责将控制权交给下一个中间件,如果当前中间件没有终结请求,并且next没有被调用,那么请求将被挂起,后边定义的中间件将得不到被执行的机会。

何时使用Next

从上边的描述我们已经知道,next函数主要是用来确保所有注册的中间件被一个接一个的执行,那么我们就应该在所有的中间件中调用next函数,但有一个特例,如果我们定义的中间件终结了本次请求,那就不应该再调用next函数,否则就可能会出问题,我们来看段代码

发送请求"/a",控制台打印日志如下:

404
GET /a 500 6.837 ms - -
Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:345:11)

为什么代码会抛异常呢,就是因为我们在res.send之后调用了next函数,虽然我们本次的请求已经被终止,但后边的404中间件依旧会被执行,而后边的中间件试图去向res的headers中添加属性值,所以就会抛出上边的异常。

读到这你可能会有个疑问,如果我不在res.send后边调用next函数,那后边定义的404中间件是不是永远都不会被执行到。现在我们删除res.send后边next函数调用,发送请求"/xxx",我们就会发现404中间件被执行了,(ㄒoㄒ),这不是和我们之前说的矛盾了吗,我们的自定义中间件没有调用next,但后边定义的中间件仍旧被执行了,这究竟是为什么呢。看来只能求助源码了~~~

Next的内部机制

function next(err) {
   
    ... //此处源码省略
    // find next matching layer
    var layer;
    var match;
    var route;
</span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">match </span><span class="pun">!==</span><span class="pln"> </span><span class="kwd">true</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> idx </span><span class="pun">&lt;</span><span class="pln"> stack</span><span class="pun">.</span><span class="pln">length</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  layer </span><span class="pun">=</span><span class="pln"> stack</span><span class="pun">[</span><span class="pln">idx</span><span class="pun">++];</span><span class="pln&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值