4

我希望通过对 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 如何处理中间件/路由调用,next或者res.redirect它们是否碰巧发生在彼此之前或之后,如上所示。

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

4

2 回答 2

6

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

var middlewareExample = function(req, res, next){
  if(req.session){
    refreshSession(req.session, next);
  }else{
    res.redirect('/authenticate');
  }
};
于 2013-03-15T07:03:52.900 回答
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但显然这是不允许的。

这是我的解决方案。

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

于 2019-08-29T01:46:15.757 回答