support error handling in middleware (#12716)

This commit is contained in:
Bogdan Ilchyshyn 2022-06-29 15:59:51 +10:00 committed by GitHub
parent 0232d1cd00
commit 3a2bbbb850
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 420 additions and 12 deletions

View File

@ -166,7 +166,25 @@ export class BaseAPI {
}) || fetchParams; }) || fetchParams;
} }
} }
let response = await (this.configuration.fetchApi || fetch)(fetchParams.url, fetchParams.init); let response = undefined;
try {
response = await (this.configuration.fetchApi || fetch)(fetchParams.url, fetchParams.init);
} catch (e) {
for (const middleware of this.middleware) {
if (middleware.onError) {
response = await middleware.onError({
fetch: this.fetchApi,
url: fetchParams.url,
init: fetchParams.init,
error: e,
response: response ? response.clone() : undefined,
}) || response;
}
}
if (response !== undefined) {
throw new FetchError(e, 'The request failed and the interceptors did not return an alternative response');
}
}
for (const middleware of this.middleware) { for (const middleware of this.middleware) {
if (middleware.post) { if (middleware.post) {
response = await middleware.post({ response = await middleware.post({
@ -207,6 +225,13 @@ export class ResponseError extends Error {
} }
} }
export class FetchError extends Error {
name: "FetchError" = "FetchError";
constructor(public cause: unknown, msg?: string) {
super(msg);
}
}
export class RequiredError extends Error { export class RequiredError extends Error {
name: "RequiredError" = "RequiredError"; name: "RequiredError" = "RequiredError";
constructor(public field: string, msg?: string) { constructor(public field: string, msg?: string) {
@ -315,9 +340,18 @@ export interface ResponseContext {
response: Response; response: Response;
} }
export interface ErrorContext {
fetch: FetchAPI;
url: string;
init: RequestInit;
error: unknown;
response?: Response;
}
export interface Middleware { export interface Middleware {
pre?(context: RequestContext): Promise<FetchParams | void>; pre?(context: RequestContext): Promise<FetchParams | void>;
post?(context: ResponseContext): Promise<Response | void>; post?(context: ResponseContext): Promise<Response | void>;
onError?(context: ErrorContext): Promise<Response | void>;
} }
export interface ApiResponse<T> { export interface ApiResponse<T> {

View File

@ -177,7 +177,25 @@ export class BaseAPI {
}) || fetchParams; }) || fetchParams;
} }
} }
let response = await (this.configuration.fetchApi || fetch)(fetchParams.url, fetchParams.init); let response = undefined;
try {
response = await (this.configuration.fetchApi || fetch)(fetchParams.url, fetchParams.init);
} catch (e) {
for (const middleware of this.middleware) {
if (middleware.onError) {
response = await middleware.onError({
fetch: this.fetchApi,
url: fetchParams.url,
init: fetchParams.init,
error: e,
response: response ? response.clone() : undefined,
}) || response;
}
}
if (response !== undefined) {
throw new FetchError(e, 'The request failed and the interceptors did not return an alternative response');
}
}
for (const middleware of this.middleware) { for (const middleware of this.middleware) {
if (middleware.post) { if (middleware.post) {
response = await middleware.post({ response = await middleware.post({
@ -218,6 +236,13 @@ export class ResponseError extends Error {
} }
} }
export class FetchError extends Error {
name: "FetchError" = "FetchError";
constructor(public cause: unknown, msg?: string) {
super(msg);
}
}
export class RequiredError extends Error { export class RequiredError extends Error {
name: "RequiredError" = "RequiredError"; name: "RequiredError" = "RequiredError";
constructor(public field: string, msg?: string) { constructor(public field: string, msg?: string) {
@ -322,9 +347,18 @@ export interface ResponseContext {
response: Response; response: Response;
} }
export interface ErrorContext {
fetch: FetchAPI;
url: string;
init: RequestInit;
error: unknown;
response?: Response;
}
export interface Middleware { export interface Middleware {
pre?(context: RequestContext): Promise<FetchParams | void>; pre?(context: RequestContext): Promise<FetchParams | void>;
post?(context: ResponseContext): Promise<Response | void>; post?(context: ResponseContext): Promise<Response | void>;
onError?(context: ErrorContext): Promise<Response | void>;
} }
export interface ApiResponse<T> { export interface ApiResponse<T> {

View File

@ -177,7 +177,25 @@ export class BaseAPI {
}) || fetchParams; }) || fetchParams;
} }
} }
let response = await (this.configuration.fetchApi || fetch)(fetchParams.url, fetchParams.init); let response = undefined;
try {
response = await (this.configuration.fetchApi || fetch)(fetchParams.url, fetchParams.init);
} catch (e) {
for (const middleware of this.middleware) {
if (middleware.onError) {
response = await middleware.onError({
fetch: this.fetchApi,
url: fetchParams.url,
init: fetchParams.init,
error: e,
response: response ? response.clone() : undefined,
}) || response;
}
}
if (response !== undefined) {
throw new FetchError(e, 'The request failed and the interceptors did not return an alternative response');
}
}
for (const middleware of this.middleware) { for (const middleware of this.middleware) {
if (middleware.post) { if (middleware.post) {
response = await middleware.post({ response = await middleware.post({
@ -218,6 +236,13 @@ export class ResponseError extends Error {
} }
} }
export class FetchError extends Error {
name: "FetchError" = "FetchError";
constructor(public cause: unknown, msg?: string) {
super(msg);
}
}
export class RequiredError extends Error { export class RequiredError extends Error {
name: "RequiredError" = "RequiredError"; name: "RequiredError" = "RequiredError";
constructor(public field: string, msg?: string) { constructor(public field: string, msg?: string) {
@ -322,9 +347,18 @@ export interface ResponseContext {
response: Response; response: Response;
} }
export interface ErrorContext {
fetch: FetchAPI;
url: string;
init: RequestInit;
error: unknown;
response?: Response;
}
export interface Middleware { export interface Middleware {
pre?(context: RequestContext): Promise<FetchParams | void>; pre?(context: RequestContext): Promise<FetchParams | void>;
post?(context: ResponseContext): Promise<Response | void>; post?(context: ResponseContext): Promise<Response | void>;
onError?(context: ErrorContext): Promise<Response | void>;
} }
export interface ApiResponse<T> { export interface ApiResponse<T> {

View File

@ -177,7 +177,25 @@ export class BaseAPI {
}) || fetchParams; }) || fetchParams;
} }
} }
let response = await (this.configuration.fetchApi || fetch)(fetchParams.url, fetchParams.init); let response = undefined;
try {
response = await (this.configuration.fetchApi || fetch)(fetchParams.url, fetchParams.init);
} catch (e) {
for (const middleware of this.middleware) {
if (middleware.onError) {
response = await middleware.onError({
fetch: this.fetchApi,
url: fetchParams.url,
init: fetchParams.init,
error: e,
response: response ? response.clone() : undefined,
}) || response;
}
}
if (response !== undefined) {
throw new FetchError(e, 'The request failed and the interceptors did not return an alternative response');
}
}
for (const middleware of this.middleware) { for (const middleware of this.middleware) {
if (middleware.post) { if (middleware.post) {
response = await middleware.post({ response = await middleware.post({
@ -218,6 +236,13 @@ export class ResponseError extends Error {
} }
} }
export class FetchError extends Error {
name: "FetchError" = "FetchError";
constructor(public cause: unknown, msg?: string) {
super(msg);
}
}
export class RequiredError extends Error { export class RequiredError extends Error {
name: "RequiredError" = "RequiredError"; name: "RequiredError" = "RequiredError";
constructor(public field: string, msg?: string) { constructor(public field: string, msg?: string) {
@ -322,9 +347,18 @@ export interface ResponseContext {
response: Response; response: Response;
} }
export interface ErrorContext {
fetch: FetchAPI;
url: string;
init: RequestInit;
error: unknown;
response?: Response;
}
export interface Middleware { export interface Middleware {
pre?(context: RequestContext): Promise<FetchParams | void>; pre?(context: RequestContext): Promise<FetchParams | void>;
post?(context: ResponseContext): Promise<Response | void>; post?(context: ResponseContext): Promise<Response | void>;
onError?(context: ErrorContext): Promise<Response | void>;
} }
export interface ApiResponse<T> { export interface ApiResponse<T> {

View File

@ -177,7 +177,25 @@ export class BaseAPI {
}) || fetchParams; }) || fetchParams;
} }
} }
let response = await (this.configuration.fetchApi || fetch)(fetchParams.url, fetchParams.init); let response = undefined;
try {
response = await (this.configuration.fetchApi || fetch)(fetchParams.url, fetchParams.init);
} catch (e) {
for (const middleware of this.middleware) {
if (middleware.onError) {
response = await middleware.onError({
fetch: this.fetchApi,
url: fetchParams.url,
init: fetchParams.init,
error: e,
response: response ? response.clone() : undefined,
}) || response;
}
}
if (response !== undefined) {
throw new FetchError(e, 'The request failed and the interceptors did not return an alternative response');
}
}
for (const middleware of this.middleware) { for (const middleware of this.middleware) {
if (middleware.post) { if (middleware.post) {
response = await middleware.post({ response = await middleware.post({
@ -218,6 +236,13 @@ export class ResponseError extends Error {
} }
} }
export class FetchError extends Error {
name: "FetchError" = "FetchError";
constructor(public cause: unknown, msg?: string) {
super(msg);
}
}
export class RequiredError extends Error { export class RequiredError extends Error {
name: "RequiredError" = "RequiredError"; name: "RequiredError" = "RequiredError";
constructor(public field: string, msg?: string) { constructor(public field: string, msg?: string) {
@ -322,9 +347,18 @@ export interface ResponseContext {
response: Response; response: Response;
} }
export interface ErrorContext {
fetch: FetchAPI;
url: string;
init: RequestInit;
error: unknown;
response?: Response;
}
export interface Middleware { export interface Middleware {
pre?(context: RequestContext): Promise<FetchParams | void>; pre?(context: RequestContext): Promise<FetchParams | void>;
post?(context: ResponseContext): Promise<Response | void>; post?(context: ResponseContext): Promise<Response | void>;
onError?(context: ErrorContext): Promise<Response | void>;
} }
export interface ApiResponse<T> { export interface ApiResponse<T> {

View File

@ -177,7 +177,25 @@ export class BaseAPI {
}) || fetchParams; }) || fetchParams;
} }
} }
let response = await (this.configuration.fetchApi || fetch)(fetchParams.url, fetchParams.init); let response = undefined;
try {
response = await (this.configuration.fetchApi || fetch)(fetchParams.url, fetchParams.init);
} catch (e) {
for (const middleware of this.middleware) {
if (middleware.onError) {
response = await middleware.onError({
fetch: this.fetchApi,
url: fetchParams.url,
init: fetchParams.init,
error: e,
response: response ? response.clone() : undefined,
}) || response;
}
}
if (response !== undefined) {
throw new FetchError(e, 'The request failed and the interceptors did not return an alternative response');
}
}
for (const middleware of this.middleware) { for (const middleware of this.middleware) {
if (middleware.post) { if (middleware.post) {
response = await middleware.post({ response = await middleware.post({
@ -218,6 +236,13 @@ export class ResponseError extends Error {
} }
} }
export class FetchError extends Error {
name: "FetchError" = "FetchError";
constructor(public cause: unknown, msg?: string) {
super(msg);
}
}
export class RequiredError extends Error { export class RequiredError extends Error {
name: "RequiredError" = "RequiredError"; name: "RequiredError" = "RequiredError";
constructor(public field: string, msg?: string) { constructor(public field: string, msg?: string) {
@ -322,9 +347,18 @@ export interface ResponseContext {
response: Response; response: Response;
} }
export interface ErrorContext {
fetch: FetchAPI;
url: string;
init: RequestInit;
error: unknown;
response?: Response;
}
export interface Middleware { export interface Middleware {
pre?(context: RequestContext): Promise<FetchParams | void>; pre?(context: RequestContext): Promise<FetchParams | void>;
post?(context: ResponseContext): Promise<Response | void>; post?(context: ResponseContext): Promise<Response | void>;
onError?(context: ErrorContext): Promise<Response | void>;
} }
export interface ApiResponse<T> { export interface ApiResponse<T> {

View File

@ -177,7 +177,25 @@ export class BaseAPI {
}) || fetchParams; }) || fetchParams;
} }
} }
let response = await (this.configuration.fetchApi || fetch)(fetchParams.url, fetchParams.init); let response = undefined;
try {
response = await (this.configuration.fetchApi || fetch)(fetchParams.url, fetchParams.init);
} catch (e) {
for (const middleware of this.middleware) {
if (middleware.onError) {
response = await middleware.onError({
fetch: this.fetchApi,
url: fetchParams.url,
init: fetchParams.init,
error: e,
response: response ? response.clone() : undefined,
}) || response;
}
}
if (response !== undefined) {
throw new FetchError(e, 'The request failed and the interceptors did not return an alternative response');
}
}
for (const middleware of this.middleware) { for (const middleware of this.middleware) {
if (middleware.post) { if (middleware.post) {
response = await middleware.post({ response = await middleware.post({
@ -218,6 +236,13 @@ export class ResponseError extends Error {
} }
} }
export class FetchError extends Error {
name: "FetchError" = "FetchError";
constructor(public cause: unknown, msg?: string) {
super(msg);
}
}
export class RequiredError extends Error { export class RequiredError extends Error {
name: "RequiredError" = "RequiredError"; name: "RequiredError" = "RequiredError";
constructor(public field: string, msg?: string) { constructor(public field: string, msg?: string) {
@ -322,9 +347,18 @@ export interface ResponseContext {
response: Response; response: Response;
} }
export interface ErrorContext {
fetch: FetchAPI;
url: string;
init: RequestInit;
error: unknown;
response?: Response;
}
export interface Middleware { export interface Middleware {
pre?(context: RequestContext): Promise<FetchParams | void>; pre?(context: RequestContext): Promise<FetchParams | void>;
post?(context: ResponseContext): Promise<Response | void>; post?(context: ResponseContext): Promise<Response | void>;
onError?(context: ErrorContext): Promise<Response | void>;
} }
export interface ApiResponse<T> { export interface ApiResponse<T> {

View File

@ -177,7 +177,25 @@ export class BaseAPI {
}) || fetchParams; }) || fetchParams;
} }
} }
let response = await (this.configuration.fetchApi || fetch)(fetchParams.url, fetchParams.init); let response = undefined;
try {
response = await (this.configuration.fetchApi || fetch)(fetchParams.url, fetchParams.init);
} catch (e) {
for (const middleware of this.middleware) {
if (middleware.onError) {
response = await middleware.onError({
fetch: this.fetchApi,
url: fetchParams.url,
init: fetchParams.init,
error: e,
response: response ? response.clone() : undefined,
}) || response;
}
}
if (response !== undefined) {
throw new FetchError(e, 'The request failed and the interceptors did not return an alternative response');
}
}
for (const middleware of this.middleware) { for (const middleware of this.middleware) {
if (middleware.post) { if (middleware.post) {
response = await middleware.post({ response = await middleware.post({
@ -218,6 +236,13 @@ export class ResponseError extends Error {
} }
} }
export class FetchError extends Error {
name: "FetchError" = "FetchError";
constructor(public cause: unknown, msg?: string) {
super(msg);
}
}
export class RequiredError extends Error { export class RequiredError extends Error {
name: "RequiredError" = "RequiredError"; name: "RequiredError" = "RequiredError";
constructor(public field: string, msg?: string) { constructor(public field: string, msg?: string) {
@ -322,9 +347,18 @@ export interface ResponseContext {
response: Response; response: Response;
} }
export interface ErrorContext {
fetch: FetchAPI;
url: string;
init: RequestInit;
error: unknown;
response?: Response;
}
export interface Middleware { export interface Middleware {
pre?(context: RequestContext): Promise<FetchParams | void>; pre?(context: RequestContext): Promise<FetchParams | void>;
post?(context: ResponseContext): Promise<Response | void>; post?(context: ResponseContext): Promise<Response | void>;
onError?(context: ErrorContext): Promise<Response | void>;
} }
export interface ApiResponse<T> { export interface ApiResponse<T> {

View File

@ -177,7 +177,25 @@ export class BaseAPI {
}) || fetchParams; }) || fetchParams;
} }
} }
let response = await (this.configuration.fetchApi || fetch)(fetchParams.url, fetchParams.init); let response = undefined;
try {
response = await (this.configuration.fetchApi || fetch)(fetchParams.url, fetchParams.init);
} catch (e) {
for (const middleware of this.middleware) {
if (middleware.onError) {
response = await middleware.onError({
fetch: this.fetchApi,
url: fetchParams.url,
init: fetchParams.init,
error: e,
response: response ? response.clone() : undefined,
}) || response;
}
}
if (response !== undefined) {
throw new FetchError(e, 'The request failed and the interceptors did not return an alternative response');
}
}
for (const middleware of this.middleware) { for (const middleware of this.middleware) {
if (middleware.post) { if (middleware.post) {
response = await middleware.post({ response = await middleware.post({
@ -218,6 +236,13 @@ export class ResponseError extends Error {
} }
} }
export class FetchError extends Error {
name: "FetchError" = "FetchError";
constructor(public cause: unknown, msg?: string) {
super(msg);
}
}
export class RequiredError extends Error { export class RequiredError extends Error {
name: "RequiredError" = "RequiredError"; name: "RequiredError" = "RequiredError";
constructor(public field: string, msg?: string) { constructor(public field: string, msg?: string) {
@ -322,9 +347,18 @@ export interface ResponseContext {
response: Response; response: Response;
} }
export interface ErrorContext {
fetch: FetchAPI;
url: string;
init: RequestInit;
error: unknown;
response?: Response;
}
export interface Middleware { export interface Middleware {
pre?(context: RequestContext): Promise<FetchParams | void>; pre?(context: RequestContext): Promise<FetchParams | void>;
post?(context: ResponseContext): Promise<Response | void>; post?(context: ResponseContext): Promise<Response | void>;
onError?(context: ErrorContext): Promise<Response | void>;
} }
export interface ApiResponse<T> { export interface ApiResponse<T> {

View File

@ -177,7 +177,25 @@ export class BaseAPI {
}) || fetchParams; }) || fetchParams;
} }
} }
let response = await (this.configuration.fetchApi || fetch)(fetchParams.url, fetchParams.init); let response = undefined;
try {
response = await (this.configuration.fetchApi || fetch)(fetchParams.url, fetchParams.init);
} catch (e) {
for (const middleware of this.middleware) {
if (middleware.onError) {
response = await middleware.onError({
fetch: this.fetchApi,
url: fetchParams.url,
init: fetchParams.init,
error: e,
response: response ? response.clone() : undefined,
}) || response;
}
}
if (response !== undefined) {
throw new FetchError(e, 'The request failed and the interceptors did not return an alternative response');
}
}
for (const middleware of this.middleware) { for (const middleware of this.middleware) {
if (middleware.post) { if (middleware.post) {
response = await middleware.post({ response = await middleware.post({
@ -218,6 +236,13 @@ export class ResponseError extends Error {
} }
} }
export class FetchError extends Error {
name: "FetchError" = "FetchError";
constructor(public cause: unknown, msg?: string) {
super(msg);
}
}
export class RequiredError extends Error { export class RequiredError extends Error {
name: "RequiredError" = "RequiredError"; name: "RequiredError" = "RequiredError";
constructor(public field: string, msg?: string) { constructor(public field: string, msg?: string) {
@ -322,9 +347,18 @@ export interface ResponseContext {
response: Response; response: Response;
} }
export interface ErrorContext {
fetch: FetchAPI;
url: string;
init: RequestInit;
error: unknown;
response?: Response;
}
export interface Middleware { export interface Middleware {
pre?(context: RequestContext): Promise<FetchParams | void>; pre?(context: RequestContext): Promise<FetchParams | void>;
post?(context: ResponseContext): Promise<Response | void>; post?(context: ResponseContext): Promise<Response | void>;
onError?(context: ErrorContext): Promise<Response | void>;
} }
export interface ApiResponse<T> { export interface ApiResponse<T> {

View File

@ -177,7 +177,25 @@ export class BaseAPI {
}) || fetchParams; }) || fetchParams;
} }
} }
let response = await (this.configuration.fetchApi || fetch)(fetchParams.url, fetchParams.init); let response = undefined;
try {
response = await (this.configuration.fetchApi || fetch)(fetchParams.url, fetchParams.init);
} catch (e) {
for (const middleware of this.middleware) {
if (middleware.onError) {
response = await middleware.onError({
fetch: this.fetchApi,
url: fetchParams.url,
init: fetchParams.init,
error: e,
response: response ? response.clone() : undefined,
}) || response;
}
}
if (response !== undefined) {
throw new FetchError(e, 'The request failed and the interceptors did not return an alternative response');
}
}
for (const middleware of this.middleware) { for (const middleware of this.middleware) {
if (middleware.post) { if (middleware.post) {
response = await middleware.post({ response = await middleware.post({
@ -218,6 +236,13 @@ export class ResponseError extends Error {
} }
} }
export class FetchError extends Error {
name: "FetchError" = "FetchError";
constructor(public cause: unknown, msg?: string) {
super(msg);
}
}
export class RequiredError extends Error { export class RequiredError extends Error {
name: "RequiredError" = "RequiredError"; name: "RequiredError" = "RequiredError";
constructor(public field: string, msg?: string) { constructor(public field: string, msg?: string) {
@ -322,9 +347,18 @@ export interface ResponseContext {
response: Response; response: Response;
} }
export interface ErrorContext {
fetch: FetchAPI;
url: string;
init: RequestInit;
error: unknown;
response?: Response;
}
export interface Middleware { export interface Middleware {
pre?(context: RequestContext): Promise<FetchParams | void>; pre?(context: RequestContext): Promise<FetchParams | void>;
post?(context: ResponseContext): Promise<Response | void>; post?(context: ResponseContext): Promise<Response | void>;
onError?(context: ErrorContext): Promise<Response | void>;
} }
export interface ApiResponse<T> { export interface ApiResponse<T> {

View File

@ -177,7 +177,25 @@ export class BaseAPI {
}) || fetchParams; }) || fetchParams;
} }
} }
let response = await (this.configuration.fetchApi || fetch)(fetchParams.url, fetchParams.init); let response = undefined;
try {
response = await (this.configuration.fetchApi || fetch)(fetchParams.url, fetchParams.init);
} catch (e) {
for (const middleware of this.middleware) {
if (middleware.onError) {
response = await middleware.onError({
fetch: this.fetchApi,
url: fetchParams.url,
init: fetchParams.init,
error: e,
response: response ? response.clone() : undefined,
}) || response;
}
}
if (response !== undefined) {
throw new FetchError(e, 'The request failed and the interceptors did not return an alternative response');
}
}
for (const middleware of this.middleware) { for (const middleware of this.middleware) {
if (middleware.post) { if (middleware.post) {
response = await middleware.post({ response = await middleware.post({
@ -218,6 +236,13 @@ export class ResponseError extends Error {
} }
} }
export class FetchError extends Error {
name: "FetchError" = "FetchError";
constructor(public cause: unknown, msg?: string) {
super(msg);
}
}
export class RequiredError extends Error { export class RequiredError extends Error {
name: "RequiredError" = "RequiredError"; name: "RequiredError" = "RequiredError";
constructor(public field: string, msg?: string) { constructor(public field: string, msg?: string) {
@ -312,9 +337,18 @@ export interface ResponseContext {
response: Response; response: Response;
} }
export interface ErrorContext {
fetch: FetchAPI;
url: string;
init: RequestInit;
error: unknown;
response?: Response;
}
export interface Middleware { export interface Middleware {
pre?(context: RequestContext): Promise<FetchParams | void>; pre?(context: RequestContext): Promise<FetchParams | void>;
post?(context: ResponseContext): Promise<Response | void>; post?(context: ResponseContext): Promise<Response | void>;
onError?(context: ErrorContext): Promise<Response | void>;
} }
export interface ApiResponse<T> { export interface ApiResponse<T> {