@feathersjs/errors
Version:
Common error types for Feathers apps
274 lines (239 loc) • 6.57 kB
text/typescript
export interface FeathersErrorJSON {
name: string
message: string
code: number
className: string
data?: any
errors?: any
}
export type DynamicError = Error & { [key: string]: any }
export type ErrorMessage = null | string | DynamicError | { [key: string]: any } | any[]
interface ErrorProperties extends Omit<FeathersErrorJSON, 'message'> {
type: string
}
export class FeathersError extends Error {
readonly type: string
readonly code: number
readonly className: string
readonly data: any
readonly errors: any
constructor(err: ErrorMessage, name: string, code: number, className: string, _data: any) {
let msg = typeof err === 'string' ? err : 'Error'
const properties: ErrorProperties = {
name,
code,
className,
type: 'FeathersError'
}
if (Array.isArray(_data)) {
properties.data = _data
} else if (typeof err === 'object' || _data !== undefined) {
const { message, errors, ...rest } = err !== null && typeof err === 'object' ? err : _data
msg = message || msg
properties.errors = errors
properties.data = rest
}
super(msg)
Object.assign(this, properties)
}
toJSON() {
const result: FeathersErrorJSON = {
name: this.name,
message: this.message,
code: this.code,
className: this.className
}
if (this.data !== undefined) {
result.data = this.data
}
if (this.errors !== undefined) {
result.errors = this.errors
}
return result
}
}
export class BadRequest extends FeathersError {
constructor(message?: ErrorMessage, data?: any) {
super(message, 'BadRequest', 400, 'bad-request', data)
}
}
// 401 - Not Authenticated
export class NotAuthenticated extends FeathersError {
constructor(message?: ErrorMessage, data?: any) {
super(message, 'NotAuthenticated', 401, 'not-authenticated', data)
}
}
// 402 - Payment Error
export class PaymentError extends FeathersError {
constructor(message?: ErrorMessage, data?: any) {
super(message, 'PaymentError', 402, 'payment-error', data)
}
}
// 403 - Forbidden
export class Forbidden extends FeathersError {
constructor(message?: ErrorMessage, data?: any) {
super(message, 'Forbidden', 403, 'forbidden', data)
}
}
// 404 - Not Found
export class NotFound extends FeathersError {
constructor(message?: ErrorMessage, data?: any) {
super(message, 'NotFound', 404, 'not-found', data)
}
}
// 405 - Method Not Allowed
export class MethodNotAllowed extends FeathersError {
constructor(message?: ErrorMessage, data?: any) {
super(message, 'MethodNotAllowed', 405, 'method-not-allowed', data)
}
}
// 406 - Not Acceptable
export class NotAcceptable extends FeathersError {
constructor(message?: ErrorMessage, data?: any) {
super(message, 'NotAcceptable', 406, 'not-acceptable', data)
}
}
// 408 - Timeout
export class Timeout extends FeathersError {
constructor(message?: ErrorMessage, data?: any) {
super(message, 'Timeout', 408, 'timeout', data)
}
}
// 409 - Conflict
export class Conflict extends FeathersError {
constructor(message?: ErrorMessage, data?: any) {
super(message, 'Conflict', 409, 'conflict', data)
}
}
// 410 - Gone
export class Gone extends FeathersError {
constructor(message?: ErrorMessage, data?: any) {
super(message, 'Gone', 410, 'gone', data)
}
}
// 411 - Length Required
export class LengthRequired extends FeathersError {
constructor(message?: ErrorMessage, data?: any) {
super(message, 'LengthRequired', 411, 'length-required', data)
}
}
// 422 Unprocessable
export class Unprocessable extends FeathersError {
constructor(message?: ErrorMessage, data?: any) {
super(message, 'Unprocessable', 422, 'unprocessable', data)
}
}
// 429 Too Many Requests
export class TooManyRequests extends FeathersError {
constructor(message?: ErrorMessage, data?: any) {
super(message, 'TooManyRequests', 429, 'too-many-requests', data)
}
}
// 500 - General Error
export class GeneralError extends FeathersError {
constructor(message?: ErrorMessage, data?: any) {
super(message, 'GeneralError', 500, 'general-error', data)
}
}
// 501 - Not Implemented
export class NotImplemented extends FeathersError {
constructor(message?: ErrorMessage, data?: any) {
super(message, 'NotImplemented', 501, 'not-implemented', data)
}
}
// 502 - Bad Gateway
export class BadGateway extends FeathersError {
constructor(message?: ErrorMessage, data?: any) {
super(message, 'BadGateway', 502, 'bad-gateway', data)
}
}
// 503 - Unavailable
export class Unavailable extends FeathersError {
constructor(message?: ErrorMessage, data?: any) {
super(message, 'Unavailable', 503, 'unavailable', data)
}
}
export interface Errors {
FeathersError: FeathersError
BadRequest: BadRequest
NotAuthenticated: NotAuthenticated
PaymentError: PaymentError
Forbidden: Forbidden
NotFound: NotFound
MethodNotAllowed: MethodNotAllowed
NotAcceptable: NotAcceptable
Timeout: Timeout
Conflict: Conflict
LengthRequired: LengthRequired
Unprocessable: Unprocessable
TooManyRequests: TooManyRequests
GeneralError: GeneralError
NotImplemented: NotImplemented
BadGateway: BadGateway
Unavailable: Unavailable
400: BadRequest
401: NotAuthenticated
402: PaymentError
403: Forbidden
404: NotFound
405: MethodNotAllowed
406: NotAcceptable
408: Timeout
409: Conflict
411: LengthRequired
422: Unprocessable
429: TooManyRequests
500: GeneralError
501: NotImplemented
502: BadGateway
503: Unavailable
}
export const errors = {
FeathersError,
BadRequest,
NotAuthenticated,
PaymentError,
Forbidden,
NotFound,
MethodNotAllowed,
NotAcceptable,
Timeout,
Conflict,
LengthRequired,
Unprocessable,
TooManyRequests,
GeneralError,
NotImplemented,
BadGateway,
Unavailable,
400: BadRequest,
401: NotAuthenticated,
402: PaymentError,
403: Forbidden,
404: NotFound,
405: MethodNotAllowed,
406: NotAcceptable,
408: Timeout,
409: Conflict,
410: Gone,
411: LengthRequired,
422: Unprocessable,
429: TooManyRequests,
500: GeneralError,
501: NotImplemented,
502: BadGateway,
503: Unavailable
}
export function convert(error: any) {
if (!error) {
return error
}
const FeathersError = (errors as any)[error.name]
const result = FeathersError
? new FeathersError(error.message, error.data)
: new Error(error.message || error)
if (typeof error === 'object') {
Object.assign(result, error)
}
return result
}