首页 > 解决方案 > 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 中间件吗?

标签: node.jsexpressexpress-session

解决方案


所有 Express 路由处理程序(无论是、app.use()还是其他任何东西)都按照注册顺序检查路由匹配。此外,一旦路由发送请求并且不调用,则不会检查其他路由是否与当前请求匹配。该请求的所有处理都将完成。app.get()app.post()next()

因此,您必须在任何想要使用该中间件结果的请求之前放置任何中间件。

有些人认为app.use()可能会检查所有处理程序是否匹配并可能在任何处理程序之前执行(如果它们匹配请求app.get()app.post()。事实并非如此。无论是哪种类型的处理程序,它们注册的顺序都有一个处理程序顺序。

如果我没有把app.use(session())中间件放在第一位,它就不起作用。

如果会话中间件不在想要使用会话的请求处理程序之前,那么当请求处理程序运行时会话变量还不会被初始化,并且req.session它本身将是undefined.

您必须将会话中间件放在任何想要使用会话变量的请求处理程序之前。


推荐阅读