不必为每个 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);
在 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);