我正在实现一个node + express js app,我在调用next
函数进入错误处理程序时遇到了问题。
我有一个render
中间件,每个控制器都由next
调用,我希望它与我的错误处理程序相同。我在controler中做的是在req
中放置一些viewProperties,然后调用下一个中间件来检索这些属性并因此呈现响应。
function render(req, res, next) {
// viewName, title, args
var properties = req.viewProperties || {};
// We only handle a res.send(message)
if (properties.body) {
res.send(properties.body);
return;
}
// We only handle a res.redirect(url)
if (properties.redirect) {
res.redirect(properties.redirect);
return;
}
properties.lang = req.app.get('lang');
properties.title = properties.title || 'Message_Me';
properties.connected = req.session ? req.session.connected : false;
properties.firstname = req.session.userFirstname || 'anonymous';
res.render(properties.name, properties);
}
当我尝试将此中间件与我的错误处理程序一起使用时,使用next()
请求只是在客户端挂起,并且从未收到过。
所以我尝试创建与错误处理程序相同的中间件:相同的函数,但是arity为4,然后在我的错误处理程序中调用next(err)
。这次响应被客户端恢复,但它没有正确呈现,它只显示堆栈跟踪。
我发现的唯一方法是在我的错误处理程序中复制此函数并粘贴它而不是调用next
。我不明白它为什么不能正常工作?
我的错误处理程序:
function redirectError(err, req, res, next) {
// Ajax call running
if (req.xhr) {
req.viewProperties = { body : err.message };
return next(err);
}
req.viewProperties = { name : 'layout/error', title : 'Erreur', message : err.message, err : err };
// Here is the probleme
next()
// next(err);
}
修改
我尝试了另一件事:我将render
方法复制到我的错误模块中作为一个简单的函数(未声明的中间件)。然后在next
错误处理程序中调用它而不是redirectError
。做了同样的行为。该函数被调用但是在客户端没有任何东西被记录下来。
鉴于
如果我复制render
函数的内容INTO redirectError
一切正常。
这里确实有一些我不明白的东西。这可能是一个我还没有注意到的更深层次的问题...... 黑暗中的谜语
编辑N2
我发现了自己的错误!我在另一个中间件return
中忘记了if
语句。这使得next
被召唤两次,而且是一个非常糟糕的行为......
作为一个结论,采用的一个好习惯是在下次呼叫时始终使用return
!
感谢laggingreflex让我继续。
答案 0 :(得分:4)
如果存在错误(抛出或通过next
),则只调用可以处理错误的下一个中间件(使用(err,req,res,next)
的arity定义的中间件)。
相反,如果不存在错误,则错误处理程序中间件(err,req,res,next)
不被调用。
因此,在您的情况下,只有当 出现错误时才会调用<{1}} ,而只有在存在错误时才会调用redirectError
#39;吨
演示:
render