functions.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. 'use strict'
  2. import boom from 'boom'
  3. import { logger } from '../config'
  4. /**
  5. * Call the error handler if a middleware function throw an error
  6. *
  7. * @param {Function} fn original middleware function of the route
  8. * @returns {Function} the same middleware function of the route but error handled
  9. */
  10. export const asyncMiddleware = fn => (req, res, next) => {
  11. Promise.resolve(fn(req, res, next)).catch(err => {
  12. // Check whether the error is a boom error
  13. if (!err.isBoom) {
  14. // The error was not recognized, send a 500 HTTP error
  15. return next(boom.internal(err))
  16. }
  17. // It is a boom error, pass it to the error handler
  18. next(err)
  19. })
  20. }
  21. // Middleware to handle middleware errors
  22. export const errorHandler = (err, req, res, next) => {
  23. const { output: { payload } } = err
  24. // Pass the error to the logging handler
  25. let logMsg = `Error ${payload.statusCode} - ${payload.error}` +
  26. ` - Message :\n${payload.message}`
  27. if (err.data) logMsg += `\nData : \n${JSON.stringify(err.data, null, 2) || err.data}`
  28. logger.error(logMsg)
  29. // Send the error to the client
  30. res.status(payload.statusCode).json({
  31. message: payload.message,
  32. data: err.data || undefined
  33. })
  34. next()
  35. }
  36. /**
  37. * Check the request contains all the required parameters
  38. *
  39. * @param {string[]} requiredParameters list of all required parameters
  40. * @param {object} parameters parameters provided in the request (req.query)
  41. * @returns {void}
  42. */
  43. export const checkRequiredParameters = (requiredParameters, parameters) => {
  44. if (!requiredParameters.every(aRequiredParameter => Object.keys(parameters).includes(aRequiredParameter)))
  45. throw boom.badRequest(`Missing parameter(s). Required parameters : ${requiredParameters.join(', ')}.`)
  46. }