【问题标题】:Sentry doesn't catch all errors in a nodejs environmentSentry 无法捕获 nodejs 环境中的所有错误
【发布时间】:2018-05-29 22:28:24
【问题描述】:

我正在尝试部署一个哨兵安装来捕获我的应用程序中的错误,但不知何故我真的不明白如何做到这一点。

我有这个示例应用程序:

const express = require('express');
const app = express();
var Raven = require('raven');
Raven.config('http://6c4b87dasdasdf3ecca9@logs.ekaf.com/7').install();
app.use(Raven.requestHandler());

app.get('/', function mainHandler(req, res) {
        throw new Error('Broke!');
});
app.use(Raven.errorHandler());
app.use(function onError(err, req, res, next) {
    res.statusCode = 500;
    res.end(res.sentry + '\n');
});

const PORT = process.env.PORT || 443;

app.listen(PORT, () => {
  console.log(`Server is listening on port ${PORT}`);
});

app.get('/OK', (req, res, next) => {
  res.send('route OK');
});

app.get('/KO', (req, res, next) => {
  res.send(blabla);
});

Sentry 完美地记录了/ 路由上的错误,但没有记录/KO 路由上的错误。我想让它记录节点控制台中可能出现的所有错误,而不使用throw error

我该怎么做?

【问题讨论】:

    标签: node.js sentry


    【解决方案1】:

    在所有路由之后放置app.use 行,尤其是onError 处理程序。 Node 的本机错误处理可能会在 Sentry 之前捕获它。

    const express = require('express');
    const app = express();
    var Raven = require('raven');
    Raven.config('http://6c4b87dasdasdf3ecca9@logs.ekaf.com/7').install();
    app.use(Raven.requestHandler());
    
    app.get('/', function mainHandler(req, res) {
            throw new Error('Broke!');
    });
    const PORT = process.env.PORT || 443;
    
    app.listen(PORT, () => {
      console.log(`Server is listening on port ${PORT}`);
    });
    
    app.get('/OK', (req, res, next) => {
      res.send('route OK');
    });
    
    app.get('/KO', (req, res, next) => {
      res.send(blabla);
    });
    
    app.use(Raven.errorHandler());
    app.use(function onError(err, req, res, next) {
        res.statusCode = 500;
        res.end(res.sentry + '\n');
    });
    

    披露:我在 Sentry 工作,但我不维护我们的 Node SDK。如果您想要更深入的答案,请在节点存储库中打开一个问题。

    【讨论】:

      【解决方案2】:

      我的错误是没有意识到 Sentry 默认不会捕获 4xx 错误,请参阅here

      默认情况下,errorHandler 只会捕获状态码为 500 或更高的错误。如果要更改它,请为其提供 shouldHandleError 回调,该回调接受中间件错误作为其参数,并通过返回适当的布尔值来决定是否应发送错误。

      要捕获所有400/500 错误,请执行以下操作:

      app.use(Sentry.Handlers.errorHandler({
        shouldHandleError: error => error.status >= 400,
      }));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-06
        • 2021-02-25
        • 2021-01-10
        • 2015-12-02
        • 2010-11-10
        • 2011-08-09
        • 1970-01-01
        • 2020-01-05
        相关资源
        最近更新 更多