如何将被拒绝的承诺转换为异常并将其从 Express 路由处理程序中抛出?

Lam*_*bda 5 javascript node.js promise express q

在我的应用程序的一个路由处理程序中,我正在调用一个返回 Q Promise 的方法。我不想使用该方法处理拒绝.catch,而是希望将其抛出并由 Express 应用程序的捕获所有错误处理程序捕获。

我尝试了 Q 的done方法,但它异步抛出异常,因此它不是由我的包罗万象的错误处理程序处理,而是一路向上传播,并且我的应用程序被终止:

// The route handler 

function index(req, res) {
    dao.findById(id).then(function (data) {
        res.send(data);
    }).done();
}

// The catch all event-handler

function catchAllErrorHandler(err, req, res, next) {
    console.log(err, req, res);
}

// Registration of the catch-all event handler

app.use(catchAllErrorHandler);
Run Code Online (Sandbox Code Playgroud)

该错误永远不会进入捕获所有错误处理程序。有没有办法让抛出的错误得到处理catchAllErrorHandler

maj*_*ann 4

这并没有直接回答你的问题,而是展示了实现你的目标的另一种方法。

Express 中的每个中间件处理程序都有签名(request, response, next)。目前您的index函数没有定义 next 。

当使用参数调用 next 时,express 认为该参数是一个错误,并对其进行适当的管理。

因此,在您的情况下,更改您的index函数以包含下一个参数,并更改.done().catch(next)在发生任何错误时调用下一个参数,并允许 Express 处理它。

dao.findById(id)
   // Handle success
    .then(function (data) {
        res.send(data);
    })
    // Handle failure
    .catch(next);
Run Code Online (Sandbox Code Playgroud)