【问题标题】:What are the next() middlewares/routes relative to app.use(express.static(...))?与 app.use(express.static(...)) 相关的 next() 中间件/路由是什么?
【发布时间】:2025-12-17 08:55:01
【问题描述】:

我可以像这样提供静态资产(由npm run building React 源代码创建):

app.use('/', express.static(path.join(__dirname, 'apps', 'home', 'build')))

如果我想保护 URL 及其静态资产,我可以这样做:

app.use(function(req, res, next) {
  if (!req.isAuthenticated()) {
    res.redirect('/login');
  }
  else {
    app.use('/profile', express.static(path.join(__dirname, 'apps', 'profile', 'build')))
    next();
  }
});

如果我不在那里调用next(),当我在/profile 进行身份验证尝试时程序会挂起。

接下来会调用哪些中间件/路由?如果没有身份验证,app.use(express.static(...)) 在没有next() 的情况下提供静态资产似乎没有问题。为什么我现在需要它?我没有为 /profile 或类似的东西定义 GET 路由。

【问题讨论】:

    标签: javascript reactjs express


    【解决方案1】:

    动态附加中间件以响应请求是不正确的。 (经过身份验证的请求将使所有未来的请求都无需使用该代码进行身份验证。)相反,您应该将授权检查中间件放在文件服务中间件之前,以允许它拦截请求。

    const requireAuthentication = (req, res, next) => {
      if (!req.isAuthenticated()) {
        res.redirect('/login');
      } else {
        next();
      }
    };
    
    app.use('/profile',
      requireAuthentication,
      express.static(path.join(__dirname, 'apps', 'profile', 'build')));
    

    【讨论】:

    • 那么分离认证中间件,然后next()就是从requireAuthentication继续到express.static(),对吧?
    • @sammy:对。 :)
    • 好的,所以在我原来的例子中,next() 是相对于确认身份验证的外部 app.use,接下来要做的是在 /profile 路由中提供这些静态资产,如内部 app.use。但就像你说的那样,这是一种有问题的意大利面条方式。谢谢,我会接受你的回答。