Blame view

node_modules/strong-error-handler/lib/handler.js 1.79 KB
f7563de62   Palak Handa   first commit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
  // Copyright IBM Corp. 2016. All Rights Reserved.
  // Node module: strong-error-handler
  // This file is licensed under the MIT License.
  // License text available at https://opensource.org/licenses/MIT
  
  'use strict';
  
  var path = require('path');
  var SG = require('strong-globalize');
  SG.SetRootDir(path.resolve(__dirname, '..'));
  var buildResponseData = require('./data-builder');
  var debug = require('debug')('strong-error-handler');
  var format = require('util').format;
  var logToConsole = require('./logger');
  var negotiateContentProducer = require('./content-negotiation');
  
  function noop() {
  }
  
  /**
   * Create a middleware error handler function.
   *
   * @param {Object} options
   * @returns {Function}
   */
  exports = module.exports = function createStrongErrorHandler(options) {
    options = options || {};
  
    debug('Initializing with options %j', options);
  
    // Log all errors via console.error (enabled by default)
    var logError = options.log !== false ? logToConsole : noop;
  
    return function strongErrorHandler(err, req, res, next) {
      debug('Handling %s', err.stack || err);
  
      logError(req, err);
  
      if (res._header) {
        debug('Response was already sent, closing the underlying connection');
        return req.socket.destroy();
      }
  
      // this will alter the err object, to handle when res.statusCode is an error
      if (!err.status && !err.statusCode && res.statusCode >= 400)
        err.statusCode = res.statusCode;
  
      var data = buildResponseData(err, options);
      debug('Response status %s data %j', data.statusCode, data);
  
      res.setHeader('X-Content-Type-Options', 'nosniff');
      res.statusCode = data.statusCode;
  
      var sendResponse = negotiateContentProducer(req, warn, options);
      sendResponse(res, data);
  
      function warn(msg) {
        res.header('X-Warning', msg);
        debug(msg);
      }
    };
  };