node.js - Express JS 中间件的排序
问题描述
我在使用 Express JS 并且正在使用 express-session。如果我不把app.use(session())
中间件放在首位,它就不起作用
app.use(session({
name: 'server-session-cookie-id',
secret: 'my express secret',
saveUninitialized: true,
resave: true
}));
app.use('/', routes);
app.set("view engine", "pug");
app.set("views", path.join(__dirname + "/views"));
app.use(flash());
如果app.use(session())
先写,它会说req.session.someVariable
未定义。
有人能解释一下 Express 如何调用 app.use 中间件吗?
解决方案
所有 Express 路由处理程序(无论是、app.use()
还是其他任何东西)都按照注册顺序检查路由匹配。此外,一旦路由发送请求并且不调用,则不会检查其他路由是否与当前请求匹配。该请求的所有处理都将完成。app.get()
app.post()
next()
因此,您必须在任何想要使用该中间件结果的请求之前放置任何中间件。
有些人认为app.use()
可能会检查所有处理程序是否匹配并可能在任何处理程序之前执行(如果它们匹配请求app.get()
)app.post()
。事实并非如此。无论是哪种类型的处理程序,它们注册的顺序都有一个处理程序顺序。
如果我没有把
app.use(session())
中间件放在第一位,它就不起作用。
如果会话中间件不在想要使用会话的请求处理程序之前,那么当请求处理程序运行时会话变量还不会被初始化,并且req.session
它本身将是undefined
.
您必须将会话中间件放在任何想要使用会话变量的请求处理程序之前。
推荐阅读
- php - 视图laravel内部未定义的变量
- android - 如何获取 ViewHolder Recycler ViewHolder 索引
- excel - 如果在后台刷新,则不会触发包含在 Listobjects(使用 Power Query 创建)中的 QueryTables 的 After_Refresh 事件
- java - Liskov 替换原则 VS 接口隔离原则
- excel - 在 Excel 中将数字转换为单词
- python - 在 try finally 块中记录未捕获的异常
- d3.js - 条形图几乎完成,但是当移动器水平移动时,上面的数据没有更新
- dkim - 当标题“h”标签展开为 2 行时,DKIM 签名失败
- php - 如何在 laravel API 中获取图像的完整路径?
- xsl-fo - 如何在 XSL FO 中迭代 json 数据?