我希望通过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
的中间件/路由呼叫,如果它们碰巧发生在彼此之前或之后,如上所示。
手动测试没有发现任何奇怪的行为,也没有超级模块。我想知道Express是否以及如何响应此类情况。此外,可以使用supertest来暴露任何潜在的不良行为。另外,如果可以的话,我想听听其他人用来测试Node / Express中间件的一般方法。
答案 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
结合使用时才起作用。