Express:在错误处理程序中调用next

时间:2015-01-10 08:48:25

标签: javascript node.js express error-handling

我正在实现一个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让我继续。

1 个答案:

答案 0 :(得分:4)

如果存在错误(抛出或通过next),则只调用可以处理错误的下一个中间件(使用(err,req,res,next)的arity定义的中间件)。

相反,如果不存在错误,则错误处理程序中间件(err,req,res,next) 被调用。

因此,在您的情况下,只有当 出现错误时才会调用<{1}} ,而只有在存在错误时才会调用redirectError #39;吨

演示:

render