node.js - 不必为每个 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
- If
postRouter
被执行,看看路由是否在next()
没有任何参数的情况下调用函数。如果next()
被称为继续处理。 - 如果
next()
使用任何参数调用,则停止处理并继续执行错误处理程序(默认情况下,这会将错误页面发送回浏览器) - 如果
next()
不叫停止处理
- If
- 如果处理继续,则第二次查看请求是否与“/users”匹配(如果确实执行)
userRouter
- If
userRouter
被执行,看看路由是否在next()
没有任何参数的情况下调用函数。如果next()
被称为继续处理。 - 如果
next()
使用任何参数调用,则停止处理并继续执行错误处理程序 - 如果
next()
不叫停止处理
- If
- 如果处理继续执行
sessionMiddleware
因此,如果您的流程(是的,它是一个程序流程,而不仅仅是对 Express 的 API 调用)就像上面那样,这意味着sessionMiddleware
不会为/posts
and/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);
推荐阅读
- android - 使用 SMS Retriever API Android 的 OTP/SMS 自动获取问题
- android - 当打印机和移动设备在 android 的同一网络(WI-FI)上时如何从 android 设备打印?
- visual-studio - 是否可以将同一 Nuget 包的不同版本安装到代码的不同分支中?
- python - iOS:如何安装和执行 Python 脚本?
- android - 图片内存大小与图片文件大小有关吗?
- c - 如何调试微控制器卡住的地方?
- excel - 突出显示单个列中的重复值
- java - Kinesis Spark 流确实读取记录:在独立集群中运行
- angular - D3 NGX 折线图在不应该有高度时出现
- c - 与 C 中的其他方法相比,将字符串实现为带有空标记的字符数组背后的决定的原因是什么?