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);
 | |
|   };
 | |
| }
 |