Node.js 将路由器表达为中间件

Node.js express routers as middleware

今天我遇到了让我困惑了一会儿的问题,因为我预计路由器的工作方式会有点不同,我不能完全理解这里发生了什么。

假设我想使用 express.Router 定义我的路由。我创建了两个路由器,一个用于授权目的,另一个用于一般路由:

let authRouter = new express.Router()
let generalRouter = new express.Router()

接下来我定义了几个路由如logindashboard路由post和get方法:

authRouter.get('login', loginHandler)
authRouter.post('login', loginHandler)
generalRouter.get('dashboard', landingHandler)

之后,我将两个路由器附加到实际的 express 应用程序对象:

app.use(authRouter)
app.use(generalRouter)

但是..我也希望我的网站重新定义 404 的工作方式,所以我为这种情况创建了一个额外的处理程序,让它成为 notFoundHandler,然后我添加 app.use(notFoundHandler) 以防万一请求尚未被其中一个处理程序捕获。最后,我们有这个处理顺序:

authRouter.get('login', loginHandler)
authRouter.post('login', loginHandler)
generalRouter.get('dashboard', landingHandler)
app.use(notFoundHandler)

事实证明,最后一条路线永远不会到达,并且不会应用新创建的 404 错误规则。我尝试将此行移动到 generalRouter 的句柄列表中,并且效果很好。 但据我所知,中间件按照您定义的顺序处理请求,因此将处理程序置于路由器句柄之外不会有任何问题,因为通过这种方式编写代码我说“当这些路由器没有响应时,响应自定义 404 错误”,但没有成功。所以。 app.use(路由器)是否隐藏了剩余的中间件还是其他东西?

UPD

事实是,我的第二个路由器也停止工作了,而且似乎遍历第一个附加路由器中的所有处理程序会影响所有其他具有相同路由参数的处理程序:

app.use(authRouter) // handles every route
app.use(generalRouter) // can't handle for some reason

即使 app.use 最终不会保留下面处理程序的使用,除非我们在其中指定响应行为,generalRouter,其中包含几个可能的用户查询无法到达。

问题已解决,而且非常简单。 app.use(handler) 使用指定的中间件处理请求。 当我将路由器作为中间件时,我从未在函数的 none 中调用 next 。 可能的解决方案之一:

app.use(authRouter, (res,req,next) => next())
...