Blame view

node_modules/strong-error-handler/lib/data-builder.js 2.23 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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
  // 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 cloneAllProperties = require('../lib/clone.js');
  var httpStatus = require('http-status');
  
  module.exports = function buildResponseData(err, options) {
    // Debugging mode is disabled by default. When turned on (in dev),
    // all error properties (including) stack traces are sent in the response
    var isDebugMode = options.debug;
  
    if (Array.isArray(err) && isDebugMode) {
      err = serializeArrayOfErrors(err);
    }
  
    var data = Object.create(null);
    fillStatusCode(data, err);
  
    if (typeof err !== 'object') {
      err = {
        statusCode: 500,
        message: '' + err,
      };
    }
  
    if (isDebugMode) {
      fillDebugData(data, err);
    } else if (data.statusCode >= 400 && data.statusCode <= 499) {
      fillBadRequestError(data, err);
    } else {
      fillInternalError(data, err);
    }
  
    var safeFields = options.safeFields || [];
    fillSafeFields(data, err, safeFields);
  
    return data;
  };
  
  function serializeArrayOfErrors(errors) {
    var details = [];
    for (var ix in errors) {
      var err = errors[ix];
      if (typeof err !== 'object') {
        details.push('' + err);
        continue;
      }
  
      var data = {};
      cloneAllProperties(data, err);
      delete data.statusCode;
      details.push(data);
    }
  
    return {
      name: 'ArrayOfErrors',
      message: 'Failed with multiple errors, ' +
        'see `details` for more information.',
      details: details,
    };
  }
  
  function fillStatusCode(data, err) {
    data.statusCode = err.statusCode || err.status;
    if (!data.statusCode || data.statusCode < 400)
      data.statusCode = 500;
  }
  
  function fillDebugData(data, err) {
    cloneAllProperties(data, err);
  }
  
  function fillBadRequestError(data, err) {
    data.name = err.name;
    data.message = err.message;
    data.code = err.code;
    data.details = err.details;
  }
  
  function fillInternalError(data, err) {
    data.message = httpStatus[data.statusCode] || 'Unknown Error';
  }
  
  function fillSafeFields(data, err, safeFields) {
    if (!Array.isArray(safeFields)) {
      safeFields = [safeFields];
    }
  
    safeFields.forEach(function(field) {
      data[field] = err[field];
    });
  }