Node.js 不必为每个路由器express指定中间件
在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); 然后在我的路由
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);