在Express.js中重定向后调用下一个中间件

时间:2013-03-14 02:35:33

标签: node.js testing express middleware

我希望通过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是否以及如何响应此类情况。此外,可以使用supertest来暴露任何潜在的不良行为。另外,如果可以的话,我想听听其他人用来测试Node / Express中间件的一般方法。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

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方法中工作的重定向 not 的任何内容。但是显然是不允许的。

这是我的解决方法。

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结合使用时才起作用。