【问题标题】:Calling to next middleware after redirect in Express.js在 Express.js 中重定向后调用下一个中间件
【发布时间】:2013-03-14 02:35:32
【问题描述】:

我希望通过对 Express.js 中间件的集成测试来推动行为。我遇到了一个有趣的情况,即应用程序背后的 Express 的行为是不可预测的(反正我不是)。

作为一个简化的例子:

var middlewareExample = function(req, res, next){
  if(req.session){
    refreshSession(req.session, function(err, data){
      if(!err){
        res.redirect('/error');
      }
    });
    next();
  }else{
    res.redirect('/authenticate');
  }
};

问题是在重定向之后对next 的调用,因为它位于内部函数之外并且是有条件的。我不确定 Express 如何处理对nextres.redirect 的中间件/路由调用,如果它们碰巧发生在另一个之前或之后,如上所示。

手动测试没有发现任何奇怪的行为,超测模块也没有。我想知道 Express 是否以及如何应对此类情况。此外,可以使用超测来暴露任何潜在的不良行为。此外,如果可以的话,我想听听其他人一般会使用什么方法来测试 Node/Express 中间件。

【问题讨论】:

  • 你想做什么? res.redirect('/error')next() 都可以在同一个请求中调用,从而搞乱整个控制流程。
  • 如果我尝试同时使用这两种方法,我会收到 Can't set headers after they are sent 错误。
  • @JonathanOng 我试图通过测试揭示当允许在同一个请求中调用两个函数时应该发生的任何损坏。
  • @robertklep 有什么想法可以在何处以及以何种方式传播该错误?
  • 它至少会显示在控制台上,但我认为你不能从“外部”检查它,因为它有点没有实际意义:响应(以重定向)已经发送到客户端。

标签: node.js testing express middleware


【解决方案1】:

您在同一个请求中发送两个响应。 next() 是响应,假设下一个处理程序也有响应,res.redirect() 也是如此。你真正想要的是:

var middlewareExample = function(req, res, next){
  if(req.session){
    refreshSession(req.session, next);
  }else{
    res.redirect('/authenticate');
  }
};

【讨论】:

    【解决方案2】:

    我在下面的示例中遇到了这个问题。

    const redirect = () => (res, resp, next) => {
      if (/* redirect condition met */) {
        return resp.status(302).redirect(`https://example.com/${path_logic()}`);
      } else {
        return next();
      }
    }
    
    app.use(redirect());
    app.get('*', static('built/project/code'));
    

    我找不到任何关于在.use 方法中工作的重定向。但显然这是不允许的。

    这是我的解决方案。

    const redirect = () => (res, resp, next) => {
      if (/* redirect condition met */) {
        return resp.status(302).redirect(`https://example.com/${path_logic()}`);
      } else {
        return next();
      }
    }
    
    app.get('*', [
      redirect(),
      static('built/project/code')
    ]);
    

    这里唯一的逻辑区别是重定向功能似乎只在与请求处理程序(.get.post 等)结合使用时才起作用,而不是.use

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-18
      • 2022-12-08
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多