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

标签 javascript node.js express promise q

在我的应用程序的一个路由处理程序中,我正在调用一个返回 Q promise 的方法。与其使用 .catch 方法处理拒绝,我希望它被抛出并被我的 Express 应用程序的 catch-all 错误处理程序捕获。

我尝试了 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);

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

最佳答案

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

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

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

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

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

关于javascript - 如何将被拒绝的 promise 转换为异常并将其从 Express 路由处理程序中抛出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31848895/

相关文章:

javascript - 如何编写选择器以在类为 "input"的元素之后查找第一个 "x"

javascript - MongoDB (Node.js) 将数据返回到数组

node.js - 如何使用 async/await 和 Promise 响应?

javascript - Express 4 ans Socket.io - 在模块中访问 app.io

node.js - Nodejs 和 Expressjs 现场打印 session

javascript - protractor 2.0 通过改变属性获取元素

javascript - Promise Angularjs 1.6 如何强制函数等待 api 响应

php - 如何像在 php 中一样将 URL 变量传递给 express.js?

javascript - 如何使用chartJs中的折线图减小三 Angular 形的底部宽度?

Node.js Express、handlebars - 获取数组的元素