1 |
|
2 | var statuses = require('statuses');
|
3 | var inherits = require('inherits');
|
4 |
|
5 | exports = module.exports = function () {
|
6 |
|
7 | var err;
|
8 | var msg;
|
9 | var status = 500;
|
10 | var props = {};
|
11 | for (var i = 0; i < arguments.length; i++) {
|
12 | var arg = arguments[i];
|
13 | if (arg instanceof Error) {
|
14 | err = arg;
|
15 | status = err.status || err.statusCode || status;
|
16 | continue;
|
17 | }
|
18 | switch (typeof arg) {
|
19 | case 'string':
|
20 | msg = arg;
|
21 | break;
|
22 | case 'number':
|
23 | status = arg;
|
24 | break;
|
25 | case 'object':
|
26 | props = arg;
|
27 | break;
|
28 | }
|
29 | }
|
30 |
|
31 | if (typeof status !== 'number' || !statuses[status]) status = 500;
|
32 | err = err || new Error(msg || statuses[status]);
|
33 | err = err || new Error(msg || statuses[status]);
|
34 | err.expose = status < 500;
|
35 | for (var key in props) err[key] = props[key];
|
36 | err.status = err.statusCode = status;
|
37 | return err;
|
38 | };
|
39 |
|
40 |
|
41 | var codes = statuses.codes.filter(function (num) {
|
42 | return num >= 400;
|
43 | });
|
44 |
|
45 | codes.forEach(function (code) {
|
46 | if (code >= 500) {
|
47 | var ServerError = function ServerError(msg) {
|
48 | var self = new Error(msg != null ? msg : statuses[code])
|
49 | Error.captureStackTrace(self, arguments.callee)
|
50 | self.__proto__ = ServerError.prototype
|
51 | return self
|
52 | }
|
53 | inherits(ServerError, Error);
|
54 | ServerError.prototype.status =
|
55 | ServerError.prototype.statusCode = code;
|
56 | ServerError.prototype.expose = false;
|
57 | exports[code] =
|
58 | exports[statuses[code].replace(/\s+/g, '')] = ServerError;
|
59 | return;
|
60 | }
|
61 |
|
62 | var ClientError = function ClientError(msg) {
|
63 | var self = new Error(msg != null ? msg : statuses[code])
|
64 | Error.captureStackTrace(self, arguments.callee)
|
65 | self.__proto__ = ClientError.prototype
|
66 | return self
|
67 | }
|
68 | inherits(ClientError, Error);
|
69 | ClientError.prototype.status =
|
70 | ClientError.prototype.statusCode = code;
|
71 | ClientError.prototype.expose = false;
|
72 | exports[code] =
|
73 | exports[statuses[code].replace(/\s+/g, '')] = ClientError;
|
74 | return;
|
75 | });
|