forked from machadogj/node-simple-errors
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
129 lines (109 loc) · 3.04 KB
/
index.js
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/**
* simple-errors module
*
* Create errors with simple factory methods for easy error handling.
* License: BSD
*/
/**
* Use Error.create(msg [, data [, inner]]) to create Error instances.
* function create
* @param msg (string)
* @param data (any type) adds metadata to the Error instance
* @param inner (any type) for chaining errors
* @api public
*/
Error.create = function ( msg, data, inner ) {
data = data || {};
var err = new Error(msg || "Unknown error");
var innerValue = inner || (data instanceof Error ? data : null);
if (innerValue) err.inner = innerValue;
if (data instanceof Array || typeof(data) !== 'object') {
err.data = data;
} else {
Object.keys(data).forEach(function (key) {
err[key] = data[key];
});
}
return err;
};
/**
* Use Error.http([code] [, msg [, data [, inner]]]) to create Error instances with status codes.
* @param code (numeric) adds status property to the error.
* @param msg (string)
* @param data (any type) adds metadata to the Error instance
* @param inner (Error|string) for chaining errors
*/
Error.http = function (code, msg, data, inner) {
if (typeof(code)==='string') {
inner = data;
data = msg;
msg = code;
code = 500;
}
code = code || 500;
msg = msg || statusCodes["" + code] || 'Unknown error';
var err = Error.create(msg, data, inner);
err.status = code;
return err;
};
/**
* Turn an Error instance into a json object recursively. Use this function
* for printing the entire error (even the stacks).
* @param err (Error|Object)
* @api public
*/
Error.toJson = function ( err ) {
if (typeof(err)==='string') return { message: err};
var info = {};
if (err instanceof Error) {
info.message = err.message;
info.stack = err.stack.split("\n");
}
if (typeof(err) === 'object') {
for (var prop in err) {
var value = err[prop];
info[prop] = (value instanceof Error) ? Error.toJson(value) : value;
}
}
return info;
};
var statusCodes = {
"400": "Bad Request",
"401": "Unauthorized",
"402": "Payment Required",
"403": "Forbidden",
"404": "Not Found",
"405": "Method Not Allowed",
"406": "Not Acceptable",
"407": "Proxy Authentication Required",
"408": "Request Timeout",
"409": "Conflict",
"410": "Gone",
"411": "Length Required",
"412": "Precondition Failed",
"413": "Request Entity Too Large",
"414": "Request-URI Too Long",
"415": "Unsupported Media Type",
"416": "Requested Range Not Satisfiable",
"417": "Expectation Failed",
"418": "I'm a teapot",
"422": "Unprocessable Entity",
"423": "Locked",
"424": "Failed Dependency",
"425": "Unordered Collection",
"426": "Upgrade Required",
"428": "Precondition Required",
"429": "Too Many Requests",
"431": "Request Header Fields Too Large",
"500": "Internal Server Error",
"501": "Not Implemented",
"502": "Bad Gateway",
"503": "Service Unavailable",
"504": "Gateway Timeout",
"505": "HTTP Version Not Supported",
"506": "Variant Also Negotiates",
"507": "Insufficient Storage",
"508": "Loop Detected",
"510": "Not Extended",
"511": "Network Authentication Required"
};