Node.js 不必为每个路由器express指定中间件

Node.js 不必为每个路由器express指定中间件,node.js,express,middleware,express-router,Node.js,Express,Middleware,Express Router,在Express中,我为每条路线使用不同的路由器,如下所示: const express = require('express'); const postRouter = require('./postRouter'); const userRouter = require('./userRouter'); const app = express(); app.use('/posts', postRouter); app.use('/users', userRouter); 然后在我的路由

在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将按顺序一次处理一个中间件

所以如果你做类似的事情

app.use('/posts', postRouter);
app.use('/users', userRouter);
app.use(sessionMiddleware);
您要做的是告诉express:

  • 首先查看请求是否与“/posts”匹配,如果它确实执行了
    postRouter
    • 如果执行了
      postRouter
      ,请查看路由是否调用
      next()
      函数 没有任何争论。如果调用
      next()
      ,则继续处理
    • 如果使用任何参数调用
      next()
      ,请停止处理并继续 到错误处理程序(默认情况下,这会将错误页发送回 (浏览器)
    • 如果
      next()
      调用停止处理
  • 如果处理继续,请查看请求是否与“/users”匹配 如果它执行了
    userRouter
    • 如果执行了
      userRouter
      ,请查看路由是否调用
      next()
      函数 没有任何争论。如果调用
      next()
      ,则继续处理
    • 如果使用任何参数调用
      next()
      ,请停止处理并继续 到错误处理程序
    • 如果
      next()
      调用停止处理
  • 如果处理继续,则执行sessionMiddleware
因此,如果您的流(是的,它是一个程序流,而不仅仅是对Express的API调用)与上面类似,这意味着
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);