2017-07-13 18:39:07 +00:00
|
|
|
import debug from 'debug';
|
2018-05-29 13:08:55 +00:00
|
|
|
import Rollbar from 'rollbar';
|
2017-07-13 18:39:07 +00:00
|
|
|
import {
|
|
|
|
isHandledError,
|
|
|
|
unwrapHandledError
|
|
|
|
} from '../utils/create-handled-error.js';
|
|
|
|
|
2018-11-29 12:12:15 +00:00
|
|
|
import { rollbar } from '../../../config/secrets';
|
2018-05-29 13:08:55 +00:00
|
|
|
|
2018-11-29 12:12:15 +00:00
|
|
|
const { appId } = rollbar;
|
|
|
|
const reporter = new Rollbar(appId);
|
2017-07-13 18:39:07 +00:00
|
|
|
const log = debug('fcc:middlewares:error-reporter');
|
|
|
|
|
2018-11-29 12:12:15 +00:00
|
|
|
const errTemplate = (error, req) => {
|
|
|
|
const { message, stack } = error;
|
|
|
|
return `
|
2018-05-29 13:08:55 +00:00
|
|
|
Time: ${new Date(Date.now()).toISOString()}
|
|
|
|
Error: ${message}
|
|
|
|
Is authenticated user: ${!!req.user}
|
|
|
|
Route: ${JSON.stringify(req.route, null, 2)}
|
2018-11-29 12:12:15 +00:00
|
|
|
Stack: ${stack}
|
2018-05-29 13:08:55 +00:00
|
|
|
|
2018-11-29 12:12:15 +00:00
|
|
|
// raw
|
|
|
|
${JSON.stringify(error, null, 2)}
|
2018-05-29 13:08:55 +00:00
|
|
|
|
|
|
|
`;
|
2018-11-29 12:12:15 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
export function reportError(err) {
|
2018-12-02 13:38:27 +00:00
|
|
|
return process.env.NODE_ENV === 'production'
|
|
|
|
? reporter.error(err.message, err)
|
|
|
|
: console.error(err);
|
2018-11-29 12:12:15 +00:00
|
|
|
}
|
2018-05-29 13:08:55 +00:00
|
|
|
|
2018-01-19 05:33:57 +00:00
|
|
|
export default function errrorReporter() {
|
2018-05-18 20:11:44 +00:00
|
|
|
if (process.env.NODE_ENV !== 'production' && process.env.ERROR_REPORTER) {
|
2017-07-13 18:39:07 +00:00
|
|
|
return (err, req, res, next) => {
|
2018-05-29 13:08:55 +00:00
|
|
|
console.error(errTemplate(err, req));
|
|
|
|
|
2017-07-13 18:39:07 +00:00
|
|
|
if (isHandledError(err)) {
|
|
|
|
// log out user messages in development
|
|
|
|
const handled = unwrapHandledError(err);
|
|
|
|
log(handled.message);
|
|
|
|
}
|
|
|
|
next(err);
|
2018-05-17 14:26:44 +00:00
|
|
|
};
|
2017-07-13 18:39:07 +00:00
|
|
|
}
|
2018-05-29 13:08:55 +00:00
|
|
|
return (err, req, res, next) => {
|
2018-06-01 17:07:28 +00:00
|
|
|
// handled errors do not need to be reported,
|
|
|
|
// they report a message and maybe redirect the user
|
|
|
|
// errors with status codes shouldn't be reported
|
|
|
|
// as they are usually user messages
|
|
|
|
if (isHandledError(err) || err.statusCode || err.status) {
|
|
|
|
return next(err);
|
|
|
|
}
|
|
|
|
// logging the error provides us with more information,
|
|
|
|
// i.e isAuthenticatedUser, req.route
|
2018-05-29 13:08:55 +00:00
|
|
|
console.error(errTemplate(err, req));
|
2018-11-29 12:12:15 +00:00
|
|
|
reportError(err);
|
|
|
|
return next(err);
|
2018-05-29 13:08:55 +00:00
|
|
|
};
|
2017-07-13 18:39:07 +00:00
|
|
|
}
|