expressJS承诺和错误处理

问题描述:

我有一个路由,首先需要查询数据库,然后与结果,查询另一个Web服务,然后用该结果呈现页面。 我有这个流程解决了,并试图找出错误处理。鉴于我与多种服务交谈,我试图在返回它们表达前按摩错误。expressJS承诺和错误处理

下面是路由的代码的结构:

Models.Episode.findById(request.params.episodeID) 
    .catch(function (error) { 
     throw (throwjs.notFound()); 
    }) 
    .then(function (episode) { 
     if (episode.getUser().id !== request.user.href) { 
      return next(throwjs.unauthorized("You do not have access to this podcast")); 
     } 
     return doSomeOtherAsyncStuff(); 
    }) 
    .then(function (queryResponse) { 
     renderPage(); 
    }) 
    .catch(function (error) { 
     next(error); 
    }); 

我的问题是用第一挡。我在这个问题上的目标是重新包装错误并停止执行并发送错误来表达中间件。

通过上面的写法,执行停止,但我的快速错误处理程序不会被调用。

我试图重写第一挡为

.catch(function(error){ 
    return next(error); 
}) 

但是,这并不解决问题。我发现的唯一解决方案是将捕捉到底。但是,然后我失去了失败的位置的背景。

任何线索我做错了什么? 感谢,奥利弗

+0

你是否真的重写了第一个catch,就像你在例子中做的那样?因为有一个错字。 – Seth

+0

@Seth好的一点,我重试只是为了确认输入错误并得到同样的问题。 – otusweb

+0

@ t.niese通过在线程的早期捕获,我知道唯一失败的是上面的语句。如果我仅在底部添加捕获物,那么我不确定是什么失败了 – otusweb

我建议采用不同的方法,这样您就不必依赖长时间运行的承诺链。通过以下方法,您已将授权和验证分离为单独的中间件,因为它们不一定是实际情节处理程序本身的关注点。此外,这种方法更具语言表达能力。

一个额外的好处是,你可以自由地将错误传递给错误处理程序,以便进一步将错误与路由处理程序分离。

function validateEpisode(req, res, next) { 
    Models.Episode 
    .findById(req.params.episodeID) 
    .then(function(episode) { 
     req.yourApp.episode = episode; 
     next() // everything's good 
    }) 
    .catch(function(error) { 
     // would be better to pass error in next 
     // so you can have a general error handler 
     // do something with the actual error 
     next(throwjs.notFound()); 
    }); 
} 

function authUserByEpisode(req, res, next) { 
    if (req.yourApp.episode.getUser().id !== req.user.href) { 
    next(throwjs.unauthorized("You do not have access to this podcast")); 
    } 

    next(); // authorized 
} 

function episodeController(req, res) { 
    // do something with req.yourApp.episode 
} 

app.get('/episode/:id', validateEpisode, authUserByEpisode, episodeController) 
+0

有趣。我必须对此进行试验。我对整个Express的事情还是比较新的。谢谢! – otusweb

嘛毕竟这是关系到throwjs框架我使用和我使用不当的事实

throw (throwjs.notFound()); 

应该

throw (new throwjs.notFound()); 

..