Node.js Express – next()callback
在Node.js Express中 – 使用app.use函数 –
为什么我不必这样做:
app.use(function(req,res,next){ //do something here next(req,res); });
通常我只是这样做,它的工作
app.use(function(req,res,next){ //do something here next(); });
?
next()
已经知道了当前正在执行的请求的req
和res
,因此你可以直接调用它。 这是为这个请求创build的一个独特的function。 它还会跟踪您当前在中间件堆栈中的位置,以便调用next()
执行链中的下一个中间件。
如果您查看路由器的快速源代码 ,您实际上可以看到本地定义的next()
函数,并且可以看到它是如何访问一堆闭包定义variables的,这些variables包括它使用的req
, res
和index counter通过中间件堆栈和一堆其他variables来推进。 因此,它已经可以访问启动下一个中间件调用所需的所有东西,所以没有理由将这些东西传递给它。
仅供参考,关于使用开放源代码的好处之一就是您可以随时查看代码并查看它的function。
当调用next()
,你有几个select:
-
你可以像
next()
那样调用它,这只会调用堆栈中的下一个中间件处理程序。 -
你可以调用它作为
next('route')
,它会跳到下一个路由处理程序。 -
你可以传递一个错误
next(err)
并停止所有进一步的中间件或路由器处理,除了error handling程序。
详细信息logging在这里: http : //expressjs.com/guide/error-handling.html 。
以下是该页面的注释:
next()
和next(err)
类似于Promise.resolve()
和Promise.reject()
。 它们允许您向Express表明这个当前处理程序已完成并处于何种状态。next(err)
会跳过链中除了下一节中描述的那些被设置来处理错误的所有剩下的处理程序。
next
的使用接受一个可选的Error
对象。 如果你没有通过它,它假定你已经准备好继续下一个中间件或你的实际挂载处理程序。 否则 ,如果传递一个Error
对象的实例,则会绕过挂载的处理程序(和顺序中间件)并直接转到error handling程序。
app.use(function (req, res, next) { if (!req.user || !req.user.isAuthorized) next(Error('not allowed')) else next() }) app.get('/:user', function (req, res, next) { res.render('users/index', { user: req.user }) }) app.use(function (err, req, res, next) { console.log(err.message) // not allowed res.render('500', err) })