Sentry不会捕获nodejs环境中的所有错误

时间:2017-12-15 17:13:56

标签: node.js 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!');
});
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

我该怎么做?

2 个答案:

答案 0 :(得分:0)

在所有路线之后放置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。如果您想要更深入的答案,请在节点仓库中打开一个问题。

答案 1 :(得分:0)

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

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

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

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