问题描述
在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