关于express 配置路由中的回调函数参数next,有一些问题想问
发布于 7 年前 作者 Huqiuwei 3995 次浏览 来自 问答

app.get("/",function (req, res, next)…); //显示首页 app.get("/regist",function (req, res, next)…); //显示注册页面 …以下省略… 和 app.get("/",function (req, res,)…); //显示首页 app.get("/regist",function (req, res)…); //显示注册页面 …以下省略… 这里上面的回调函数参数中有next,下面的回调函数参数没有next,具体都有什么区别? http://cnodejs.org/topic/5757e80a8316c7cb1ad35bab 一文中写到,next函数主要是用来确保所有注册的中间件被一个接一个的执行,但本人看到的包括书本和网上的部分代码中,也出现了大量不使用next的情况,并且也有包含next和不含next都出现的情况,请问这是什么原因呢?

并且本人在学习部分express开源项目的时候,发现有些作者在使用 function (req, res, next){…}中,函数体中没有next(),这个时候的next参数作用体现在哪里?

第一次提问语言组织比较混乱,还是希望大家能够帮忙解答,不胜感激

10 回复

route里处理完逻辑直接就渲染页面了,或者返回数据了,用不到next(),一般写express中间件,肯定最后一行上next,要不然其他的中间件就无法继续运行了。

@maochunguang 谢谢回答,但是一般的route里面,用不到next(),那next具体是怎么运行的呢,另外route里面哪些时候的回调函数要加next参数,哪些时候不需要呢

next的作用主要运行下个月中间件, 比如,你在路由前面,写一个记录日志的中间件,执行next后,才可以运行你的路由中间件

来自酷炫的 CNodeMD

@lvgithub 谢谢回答,我主要的疑惑是,如果function (req, res, next)函数体中,并没有next()语句的话,那么next在这里能起到什么效果呢,或者说,在函数体没有next()的情况下,function (req, res, next)和function (req, res)适用场景有什么不同呢?

next只是个变量名,第三个参数是来接收执行下一中间件的函数,用gohead也行,没用到的话就不管,如果用eslint,可能会报错,不要过多纠结,用到的话你肯定就要用一个参数来接收,没用到的话你接不接收都无所谓

如果不是错误中间件 (req, res, next),而且当前中间件不调用 next , 那么 next 不写没关系,无非就是这个参数没用到(即,当前中间件后面的中间件没机会执行)。

但是:

如果是错误中间件 (err, req, res, next),不好意思,哪怕你不用 next , 中间件的四个参数一定要写上。 因为,express 内部是通过 function.length === 4 ?来判断当前中间件是否为错误中间件。 如果next不写, (err, req, res) 的 function.length === 3 ,express 会认为该中间件为非错误中间件。

建议简单读下源码,就知道怎么回事了。

可以把它想象成一个特殊的回调函数(其实是所谓的尾调用):本函数逻辑处理完了,后面还有吗,还有就调用next,继续下一个处理;没有就停止(一般会输出数据或者页面,http请求完成,这时候next没啥用,参数列表没它有它无关紧要…);next 如楼上所说,只是个参数名,至于是否调用,看你需求的… 就是个普通函数,多看几次你就清楚了

@Telanx 谢谢,我这下明白了

@vincentLiuxiang 谢谢如此详细的回答,这下明白了

@DevinXian 谢谢回答,现在明白了

回到顶部