app/controllers/error-handler.js

/**
 * @module error-handler
 */

// var debug = require( 'debug' )( 'error-handler' );

/**
 * @param {module:api-controller~ExpressRequest} req - HTTP request
 * @param {Error} error - Error object.
 */
function getErrorMessage( req, error ) {
    if ( error.message ) {
        // convert certain set of messages into a more readable
        // and translated message
        if ( /ECONNREFUSED/.test( error.message ) ) {
            return req.i18n.t( 'error.econnrefused' );
        }

        // else output the message untranslated
        return error.message;
    } else if ( error.translationKey ) {
        // return translated message
        return req.i18n.t( error.translationKey, error.translationParams );
    } else {
        // return error code
        return error.code;
    }
}

module.exports = {
    /**
     * @param {Error} err - Error object
     * @param {module:api-controller~ExpressRequest} req - HTTP request
     * @param {module:api-controller~ExpressResponse} res - HTTP response
     * @param {Function} next - Express callback
     */
    production( err, req, res, next ) {// eslint-disable-line no-unused-vars
        const body = {
            code: err.status || 500,
            message: getErrorMessage( req, err )
        };
        const contentType = res.get( 'Content-type' );
        res.status( err.status || 500 );
        if ( contentType && contentType.indexOf( 'application/json' ) === 0 ) {
            res.json( body );
        } else {
            res.render( 'error', body );
        }
    },
    /**
     * @param {Error} err - Error object
     * @param {module:api-controller~ExpressRequest} req - HTTP request
     * @param {module:api-controller~ExpressResponse} res - HTTP response
     * @param {Function} next - Express callback
     */
    development( err, req, res, next ) {// eslint-disable-line no-unused-vars
        const body = {
            code: err.status || 500,
            message: getErrorMessage( req, err ),
            stack: err.stack
        };
        const contentType = res.get( 'Content-type' );
        res.status( err.status || 500 );
        if ( contentType && contentType.indexOf( 'application/json' ) === 0 ) {
            res.json( body );
        } else {
            res.render( 'error', body );
        }
    },
    /**
     * @param {module:api-controller~ExpressRequest} req - HTTP request
     * @param {module:api-controller~ExpressResponse} res - HTTP response
     * @param {Function} next - Express callback
     */
    '404': function( req, res, next ) {
        const error = new Error( req.i18n.t( 'error.pagenotfound' ) );
        error.status = 404;
        next( error );
    }
};