不必为每个 Router express 指定中间件

Not Have To Specify Middleware for each Router express

在 Express 中,我为每条路线使用不同的路由器,如下所示:

const express = require('express');
const postRouter = require('./postRouter');
const userRouter = require('./userRouter');
const app = express();


app.use('/posts', postRouter);
app.use('/users', userRouter);

然后在我的路由器文件中,我有路由。

但是,假设我在所有页面上都使用会话。如果我想这样做,我必须在每个路由器文件中说 router.use(sessionMiddleware);

我的问题是,如果我仍然可以使用多个路由器而不必在每个文件中指定中间件。我已经尝试 app.use(); 但那不起作用。

谢谢

您需要做您声称行不通的事情:

app.use(sessionMiddleware);

不过我可以猜到为什么您的尝试不起作用。这可能是因为你对 Express 的工作方式有误解。

express 的核心是一个中间件处理引擎。您在 Express 中配置一个中间件列表(端点也是中间件,它们恰好是最后一个被执行),Express 将按顺序一次处理一个。

最后一句话是最重要的理解:Express 将按顺序一次处理一个中间件

所以如果你做类似的事情

app.use('/posts', postRouter);
app.use('/users', userRouter);
app.use(sessionMiddleware);

你正在做的是告诉快递:

  • 首先查看请求是否匹配'/posts',如果确实执行postRouter
    • 如果执行了postRouter查看路由是否调用了next()函数 没有任何争论。如果调用next()继续处理。
    • 如果使用任何参数调用 next() 停止处理 并继续 到错误处理程序(默认情况下,这会将错误页面发送回 浏览器)
    • 如果 next() 未调用 停止处理
  • 如果处理继续,其次查看请求是否匹配“/users” 如果它执行 userRouter
    • 如果执行了userRouter 查看路由是否调用了next()函数 没有任何争论。如果调用next()继续处理。
    • 如果使用任何参数调用 next() 停止处理 并继续 到错误处理程序
    • 如果 next() 未调用 停止处理
  • 如果处理继续执行sessionMiddleware

因此,如果您的流程(是的,这是一个程序流程,不仅仅是 API 对 Express 的调用)如上所示,这意味着 sessionMiddleware 将不会为 /posts/users 路线。

这意味着您需要按如下方式更改程序流程:

app.use(sessionMiddleware);
app.use('/posts', postRouter);
app.use('/users', userRouter);

如您所见,Express 非常灵活。例如,您希望 /posts 使用您的会话中间件而不是 /users。您可以这样做:

app.use('/users', userRouter);
app.use(sessionMiddleware);
app.use('/posts', postRouter);