位置: 编程技术 - 正文

nodejs对express中next函数的一些理解(node的express)

编辑:rootadmin

推荐整理分享nodejs对express中next函数的一些理解(node的express),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:nodejs的express框架详解,nodejsexpress教程,node中express的用处,node.jsexpress,nodejs中的express,node.jsexpress,node的express,node的express,内容如对您有帮助,希望把文章链接给更多的朋友!

最近公司在使用node做前后端分离,采用的web框架是express,所以对express框架进行了深入的了解,前段时间写了篇关于express路由的文章,但是在那篇文章中貌似少了一个很重要的内容,就是express的next,所以今天单独来说说express的next。

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

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

Next的作用

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

何时使用Next

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

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

nodejs对express中next函数的一些理解(node的express)

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

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

Next的内部机制

上边就是express中next的源码,为了更容易说明问题,对代码进行了删减。从上边的源码可以发现,next函数内部有个while循环,每次循环都会从stack中拿出一个layer,这个layer中包含了路由和中间件信息,然后就会用layer和请求的path就行匹配,如果匹配成功就会执行layer.handle_request,调用中间件函数。但如果匹配失败,就会循环下一个layer(即中间件)。

现在我们就能解释上边提出的问题了,为什么我们的自定义中间件中没调用next函数,但后边的中间件仍旧会被执行到,因为我们请求的"/xxx"匹配不到我们注册的"/a"路由中间件,所以while循环会继续往下执行,匹配中间件成功,所以会执行中间件。

注意:app.use注册的中间件,如果path参数为空,则默认为"/",而path为"/"的中间件默认匹配所有的请求。

有一点需要特别指出,其实我们在定义路由中间件的时候函数的第三个参数next和我们定义非路由中间件的函数的第三个参数next不是同一个next,我们在上边看到的是非路由中间件的next,而路由中间件的next函数是这样的

这个next比上边的那个next要简单很多,它负责同一个路由的多个中间件的控制权的传递,并且它会接收一个参数"route",如果调用next(“route”),则会跳过当前路由的其它中间件,直接将控制权交给下一个路由。

最后有必要再说一说next(err),next(err)是如何将控制权传递到错误处理中间件的,从前边的代码我们知道,当调用next(err)是,express内部会调用layer.handle_error,那我们来看看它的源码

代码中的fn就是中间件函数,express会对fn的参数个数进行判断,如果参数个数不等于4则认为不是错误处理中间件,则继续调用next(err),这样就会进入到下一个中间件函数,继续进行参数个数判断,如此方式一直到某个中间件函数的参数个数是4,就认为找到了错误处理中间件,然后执行此中间件函数。

标签: node的express

本文链接地址:https://www.jiuchutong.com/biancheng/380867.html 转载请保留说明!

上一篇:nodejs 图解express+supervisor+ejs的用法(推荐)(nodejs详解)

下一篇:Express + Session 实现登录验证功能

  • 机动车销售统一专票图片
  • 汽车折旧计提完了处理后怎么做账务处理
  • 机动车统一发票税率多少
  • 任意盈余公积使用范围
  • 农产品普票进项税抵扣怎么做账
  • 印花税缴款怎么用银行卡支付
  • 广告制作税目
  • 预收款项增值税
  • 增值税税额由哪方承担
  • 如何计算应交税
  • 行政单位预算外资金收入
  • 外经证预缴附加税
  • 汽车以租代售合法吗
  • 劳动局仲裁支付的补偿怎么做账?
  • 生产企业的安全员好干吗
  • 帮别的公司做账的叫什么公司
  • 叉车在固定资产里叫什么
  • 园林绿化公司要交税吗
  • 营利性医院如何开办对外药房业务
  • 工程个人所得税扣除标准是多少
  • 物业公司一般纳税人怎么抵扣
  • 现金流量表中所指的现金是指( )
  • 小规模纳税人申报表2023年怎么填写
  • 公司办公楼转让缴纳增值税的依据
  • 固定资产大修理怎么界定
  • 可供出售金融资产是指什么
  • 以前年度进项税少记了如何调整
  • 企业进口葡萄酒税率多少
  • 企业已确认销售收入的售出商品发生销售折让,且不属于
  • 准予从销项税额中扣除的有
  • 苹果充电宝怎么验真假
  • 保证金结息的会计分录
  • PHP:stream_get_line()的用法_Stream函数
  • 增值税发票红冲后税款怎么办
  • 关于农产品的法律
  • PHP生成静态页面
  • 个人销售住房是否免征土地增值税
  • 资产减值损失如何录入
  • 生产企业成本会计难吗?
  • 自产产品对外捐赠销项税额怎么计算
  • php批量删除文件
  • vue-router + element-plus实现面包屑导航栏和路由标签栏
  • php处理xml数据
  • 员工通行费合法报销
  • 超过离线开票限定时间怎么办
  • 火车票抵扣进项税需要认证吗
  • 织梦网站老是被挂马
  • mongodb副本集群
  • 员工持股平台合伙企业如何设立
  • 不动产进项税额抵扣从什么时候开始
  • 吃饭的票如何写报销单
  • 年均复合增长率该怎么算?
  • 工商年报纳税总额包括滞纳金吗
  • mac下安装mysql
  • 小规模纳税人国税地税都要交吗
  • 坏账准备的会计处理方法
  • 旅行社代订的机票可以抵扣吗
  • 红字专用发票怎么做账
  • 公司帐户到银行怎么取钱
  • 房地产公司支付工程款账务处理
  • 酒店购买的餐具可以退吗
  • 电脑上的win8键盘怎么打开
  • win10笔记本连接不了wifi
  • winnook.exe - winnook是什么进程
  • 电脑ems是什么意思啊
  • win8.1网络不可用怎么办
  • 电脑开机后显示xp界面后一直是黑屏状态
  • 笔记本win8.1怎么重装系统
  • windows7调节音量
  • 控制面板win8在哪里
  • 晚上睡觉艾草贴肚脐
  • js字符串includes
  • opengl中点画圆算法
  • css美化表单 案例
  • jQ处理xml文件和xml字符串的方法(详解)
  • WINDOWS 同时安装 python2 python3 后 pip 错误的解决方法
  • jquery动态生成页面
  • 结转城市维护建设税
  • 小学语文教学的核心素养
  • portal
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设