| 
									
										
										
										
											2017-07-13 11:39:07 -07:00
										 |  |  | import debug from 'debug'; | 
					
						
							| 
									
										
										
										
											2018-05-29 14:08:55 +01:00
										 |  |  | import Rollbar from 'rollbar'; | 
					
						
							| 
									
										
										
										
											2017-07-13 11:39:07 -07: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 14:08:55 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-29 12:12:15 +00:00
										 |  |  | const { appId } = rollbar; | 
					
						
							|  |  |  | const reporter = new Rollbar(appId); | 
					
						
							| 
									
										
										
										
											2017-07-13 11:39:07 -07: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 14:08:55 +01: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 14:08:55 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-29 12:12:15 +00:00
										 |  |  | // raw
 | 
					
						
							|  |  |  | ${JSON.stringify(error, null, 2)} | 
					
						
							| 
									
										
										
										
											2018-05-29 14:08:55 +01: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 14:08:55 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-18 21:33:57 -08:00
										 |  |  | export default function errrorReporter() { | 
					
						
							| 
									
										
										
										
											2018-05-19 01:41:44 +05:30
										 |  |  |   if (process.env.NODE_ENV !== 'production' && process.env.ERROR_REPORTER) { | 
					
						
							| 
									
										
										
										
											2017-07-13 11:39:07 -07:00
										 |  |  |     return (err, req, res, next) => { | 
					
						
							| 
									
										
										
										
											2018-05-29 14:08:55 +01:00
										 |  |  |       console.error(errTemplate(err, req)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-13 11:39:07 -07:00
										 |  |  |       if (isHandledError(err)) { | 
					
						
							|  |  |  |         // log out user messages in development
 | 
					
						
							|  |  |  |         const handled = unwrapHandledError(err); | 
					
						
							|  |  |  |         log(handled.message); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       next(err); | 
					
						
							| 
									
										
										
										
											2018-05-17 15:26:44 +01:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2017-07-13 11:39:07 -07:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-05-29 14:08:55 +01:00
										 |  |  |   return (err, req, res, next) => { | 
					
						
							| 
									
										
										
										
											2018-06-01 18:07:28 +01: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 14:08:55 +01:00
										 |  |  |     console.error(errTemplate(err, req)); | 
					
						
							| 
									
										
										
										
											2018-11-29 12:12:15 +00:00
										 |  |  |     reportError(err); | 
					
						
							|  |  |  |     return next(err); | 
					
						
							| 
									
										
										
										
											2018-05-29 14:08:55 +01:00
										 |  |  |   }; | 
					
						
							| 
									
										
										
										
											2017-07-13 11:39:07 -07:00
										 |  |  | } |