Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

dodoru/js-http-errors

Repository files navigation

js-http-errors

Best Practices for HTTP API Error Handling

  1. be easy and flexible to humans
  2. support richer error codes with custom 5-digit errno
  3. auto detect standard HTTP_STATUS_CODES with status
  4. auto generate random request_id
  5. JSON-API Response:
  • responseData:{ <int:code>, <str:error> ,<str:request_id> }
  • responseDataV2: { <obj:error> , <str:request_id> }

installation

require nodejs > v7.6.0 for class extends support

npm install js-http-errors

parameters (attributes of ApiError)

  • @status :int:alias=status_code:

    • HTTP STATUS CODE, default = 400
    • HTTP返回状态码,默认值400
  • @message :str:alias=error_msg:

    • error message content
    • 错误文本信息
  • @errno :int:alias=code:

    • error code, default=40000
    • suggest to use 5-digit number with its first 3-digit represent HTTP STATUS CODE
    • 错误码, 默认值为 40000, 建议使用 5 位数,其中前 3 位应设计等于 http status code 返回状态码
  • @trackError:object:

    • Original Error Tracked by ApiError, default is null
    • 原始错误Error,默认值为 null

usage

1. ApiError

const http_errors = require("js-http-errors");
// 0. support init Error by `new ApiError` || `ApiError.new` || `apiError` 
let e1 = new http_errors.ApiError(40100);
let e2 = new http_errors.ApiError(401);
let e3 = new http_errors.ApiError({errno:40102, message:"require re-login"});
// or 
let e4 = http_errors.ApiError.new(40100);
let e5 = http_errors.ApiError.new(401);
let e6 = http_errors.ApiError.new({errno:40102, message:"require re-login"});
// or
let e7 = http_errors.apiError(40100);
let e8 = http_errors.apiError(401);
// 1. json response data with random request_id
console.log(e7.responseData());
/*
{
 code: 40100,
 error: 'User Require Login',
 request_id: 'X6822759T8242827'
}
*/
console.log(e8.responseDataV2());
/*
{
 request_id: 'X6822759T5B7U3TR',
 error: {
 name: 'ApiError',
 errno: 40100,
 message: 'Unauthorized',
 trackError: null
 }
}
*/
// 2. suggest to use `apiError` or `apiError.new`, avoid to renew ApiError duplicated 
let e9 = http_errors.apiError({errno:40102, message:"require re-login"});
let e10 = http_errors.apiError(e9); 
// e9 === e10 , while e9 !== new http_errors.ApiError(e9)
// 3. throw Error immediately by `abort`
http_errors.abort(401); // detect message from HTTP_STATUS_CODES 
http_errors.abort(40100); // detect message from defaultErrnoMessages
let err = new Error("Local Error")
http_errors.abort(403, err); 
// equal to: `http_errors.abort({status:403, trackError:err});` 
 

2. HTTP_STATUS_CODES

  • Auto detect error message by status with HTTP_STATUS_CODES
// standard http status codes and messages
const HTTP_STATUS_CODES = {
 // 1xx Informational response
 "100": "Continue",
 "101": "Switching Protocols",
 "102": "Processing",
 "103": "Early Hints", // RFC 8297
 // 2xx Success
 "200": "Ok",
 "201": "Created",
 "202": "Accepted",
 "203": "Non Authoritative Information",
 "204": "No Content",
 "205": "Reset Content",
 "206": "Partial Content",
 "207": "Multi Status",
 "208": "Already Reported", // RFC 5842 WebDAV
 "218": "This Is Fine", // not standard, Apache Web Server
 "226": "Im Used", // RFC 3229
 // 3xx Redirection
 "300": "Multiple Choices",
 "301": "Moved Permanently",
 "302": "Moved Temporarily",
 "303": "See Other",
 "304": "Not Modified",
 "305": "Use Proxy",
 "307": "Temporary Redirect",
 "308": "Permanent Redirect",
 // 4xx Client errors
 "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 Too Long",
 "414": "Request Uri Too Long",
 "415": "Unsupported Media Type",
 "416": "Requested Range Not Satisfiable",
 "417": "Expectation Failed",
 "418": "Im A Teapot",
 "419": "Insufficient Space On Resource",
 "420": "Method Failure",
 "421": "Misdirected request",
 "422": "Unprocessable Entity", // RFC 4918 WebDAV
 "423": "Locked", // RFC 4918 WebDAV
 "424": "Failed Dependency", // RFC 4918 WebDAV
 "425": "Too Early", // RFC 8470
 "426": "Upgrade Required", // RFC 2817: require client use TLS/1.0
 "428": "Precondition Required",
 "429": "Too Many Requests",
 "431": "Request Header Fields Too Large",
 "449": "Retry With", // RFC 2616 WebDAV: Microsoft
 "451": "Unavailable For Legal Reasons", // RFC 7725: used in Exchange ActiveSync
 // 5xx Server errors
 "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", // RFC 2295
 "507": "Insufficient Storage", // RFC 4918 WebDAV
 "508": "Loop Detected", // RFC 5842 WebDAV
 "509": "Bandwidth Limit Exceeded", // not standard, but common
 "510": "Not Extended", // RFC 2774
 "511": "Network Authentication Required",
 "600": "Unparseable Response Headers", // not standard, used infrequently in China
};
  • Want to customize the HTTP_STATUS_CODES ?
const HTTP_STATUS_CODES = require("js-http-errors").HTTP_STATUS_CODES;
HTTP_STATUS_CODES[401] = "Login Required"

3. ErrnoMessages

  • richer error codes and messages
const defaultErrnoMessages = {
 40000: 'Unknown Error',
 40005: 'Invalid Http Request',
 40099: 'Mysql Execute Error',
 40100: 'User Require Login',
 40300: 'User Forbidden/Unauthorized',
 40400: 'Source Not Found',
 40900: 'SqlError: You should not insert a duplicated item to database',
};
  • you may update the defaultErrnoMessages to customize errno messages
const defaultErrnoMessages = require("js-http-errors").defaultErrnoMessages;
defaultErrnoMessages[40041] = "Invalid Password"
  • suggest to use 5-digit-number with its first 3-digit represent HTTP STATUS CODE

About

Best Practices for Http Api Error Response Handling

Resources

Stars

Watchers

Forks

Packages

Contributors

AltStyle によって変換されたページ (->オリジナル) /