不必为每个路由器表达指定中间件

问题描述

在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);

您正在做的事情是告诉快递:

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

因此,如果您的流程(是的,这是程序流程,而不仅仅是对Express的API调用)就像上面那样,则意味着sessionMiddleware和{{1}都不会执行}路线。

这意味着您需要按以下步骤更改程序流程:

/posts

如您所见,Express非常灵活。假设您要/users使用会话中间件,但不想使用app.use(sessionMiddleware); app.use('/posts',userRouter); 。您可以改为:

/posts

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...