你需要做你声称不起作用的事情:
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
因此,如果您的流程(是的,它是一个程序流程,而不仅仅是对 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);