【问题标题】:Not Have To Specify Middleware for each Router express不必为每个 Router express 指定中间件
【发布时间】:2020-08-26 02:46:44
【问题描述】:

在 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(); 但这不起作用。

谢谢

【问题讨论】:

    标签: node.js express middleware express-router


    【解决方案1】:

    你需要做你声称不起作用的事情:

    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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-18
      • 2021-06-26
      • 2013-08-30
      • 2017-05-24
      • 1970-01-01
      相关资源
      最近更新 更多