express.js global try / catch

时间:2016-07-05 11:58:23

标签: javascript node.js express

我正在使用Express在Node JS上开发一个休息服务器。

我正在尝试将所有端点包装在try \ catch块中,因此错误的中心点会将详细信息回复给发件人。 我的问题是响应(res实例)对于每个端点方法都是活着的,但我不知道如何使它成为全局的。

try {
    app.get('/webhook', function (req, res) {
        webhook.register(req, res);
    });

    app.get('/send', function (req, res) {
        sendAutoMessage('1004426036330995');
    });

    app.post('/webhook/subscribe', function (req, res) {
        webhook.subscribe("test");
    });

    app.post('/webhook/unsubscribe', function (req, res) {
        webhook.unsubscribe("test");
    });
} catch (error) {
    //response to user with 403 error and details
}

3 个答案:

答案 0 :(得分:6)

try catch无法异步捕获错误。 这将有效:

app.get('/webhook', function (req, res) {
        try { 
          //enter code here
        } catch (error) {
          // something here
        }
    });

但它是本地的而不是最好的方式。

好的方法是制作错误处理中间件功能。它是全球性的。您需要在所有app.use()之后定义并路由呼叫。

    app.use(function(err, req, res, next) {
      // This is error handler
    });

您可以像往常一样将包含错误详情的html页面发送给客户。

此外,默认情况下,Express具有内置错误处理程序。错误将通过堆栈跟踪写入客户端(它在生产模式下不起作用)。

答案 1 :(得分:1)

有一个库(express-async-errors)可以满足您的需求。 这使您可以编写异步路由处理程序,而无需将语句包装在try / catch块中并使用全局错误处理程序来捕获它们。 要进行此工作,您必须:
1.安装express-async-errors软件包
2.导入包(在路线之前)
3.设置全局快递错误处理程序
4.编写异步路由处理程序(More info about this

用法示例:

import express from 'express';
import 'express-async-errors';

const app = express();

// route handlers must be async
app.get('/webhook', async (req, res) => {
    webhook.register(req, res);
});

app.get('/send', async (req, res) => {
    sendAutoMessage('1004426036330995');
});

app.post('/webhook/subscribe', async (req, res) => {
    webhook.subscribe("test");
});

app.post('/webhook/unsubscribe', async (req, res) => {
    webhook.unsubscribe("test");
});

// Global error handler - route handlers/middlewares which throw end up here
app.use((err, req, res, next) => {
    // response to user with 403 error and details
});

答案 2 :(得分:-1)

当调用某些第三个函数时,这种try catch不会捕获错误做最好的解决方案将使用全局异常处理程序

app.use(function(err, req, res, next) {
     res.status(err.status || 500);
     res.end();
});

你也必须在你的终点处理程序中使用promises 这将捕获任何范围内的错误