63 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import debug from 'debug';
 | 
						|
import Rollbar from 'rollbar';
 | 
						|
import {
 | 
						|
  isHandledError,
 | 
						|
  unwrapHandledError
 | 
						|
} from '../utils/create-handled-error.js';
 | 
						|
 | 
						|
import { rollbar } from '../../../config/secrets';
 | 
						|
 | 
						|
const { appId } = rollbar;
 | 
						|
const reporter = new Rollbar(appId);
 | 
						|
const log = debug('fcc:middlewares:error-reporter');
 | 
						|
 | 
						|
const errTemplate = (error, req) => {
 | 
						|
  const { message, stack } = error;
 | 
						|
  return `
 | 
						|
Time: ${new Date(Date.now()).toISOString()}
 | 
						|
Error: ${message}
 | 
						|
Is authenticated user: ${!!req.user}
 | 
						|
Route: ${JSON.stringify(req.route, null, 2)}
 | 
						|
Stack: ${stack}
 | 
						|
 | 
						|
// raw
 | 
						|
${JSON.stringify(error, null, 2)}
 | 
						|
 | 
						|
`;
 | 
						|
};
 | 
						|
 | 
						|
export function reportError(err) {
 | 
						|
  return process.env.NODE_ENV === 'production'
 | 
						|
    ? reporter.error(err.message, err)
 | 
						|
    : console.error(err);
 | 
						|
}
 | 
						|
 | 
						|
export default function errrorReporter() {
 | 
						|
  if (process.env.NODE_ENV !== 'production' && process.env.ERROR_REPORTER) {
 | 
						|
    return (err, req, res, next) => {
 | 
						|
      console.error(errTemplate(err, req));
 | 
						|
 | 
						|
      if (isHandledError(err)) {
 | 
						|
        // log out user messages in development
 | 
						|
        const handled = unwrapHandledError(err);
 | 
						|
        log(handled.message);
 | 
						|
      }
 | 
						|
      next(err);
 | 
						|
    };
 | 
						|
  }
 | 
						|
  return (err, req, res, next) => {
 | 
						|
    // 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
 | 
						|
    console.error(errTemplate(err, req));
 | 
						|
    reportError(err);
 | 
						|
    return next(err);
 | 
						|
  };
 | 
						|
}
 |