首页 > 解决方案 > 不必为每个 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();了,但这不起作用。

谢谢

标签: node.jsexpressmiddlewareexpress-router

解决方案


你需要做你声称不起作用的事情:

app.use(sessionMiddleware);

但是我可以猜到为什么你的尝试不起作用。这可能来自您对 Express 工作原理的误解。

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

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

所以如果你做类似的事情

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

你正在做的是告诉快递:

  • 首先查看请求是否匹配'/posts',如果它执行postRouter
    • IfpostRouter被执行,看看路由是否在next()没有任何参数的情况下调用函数。如果next()被称为继续处理。
    • 如果next()使用任何参数调用,则停止处理并继续执行错误处理程序(默认情况下,这会将错误页面发送回浏览器)
    • 如果next()不叫停止处理
  • 如果处理继续,则第二次查看请求是否与“/users”匹配(如果确实执行)userRouter
    • IfuserRouter被执行,看看路由是否在next()没有任何参数的情况下调用函数。如果next()被称为继续处理。
    • 如果next()使用任何参数调用,则停止处理并继续执行错误处理程序
    • 如果next()不叫停止处理
  • 如果处理继续执行sessionMiddleware

因此,如果您的流程(是的,它是一个程序流程,而不仅仅是对 Express 的 API 调用)就像上面那样,这意味着sessionMiddleware不会为/postsand/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);

推荐阅读