Skip to content

Commit 16a34d9

Browse files
authored
fix: Returned error for 5xx server response has incorrect format (#2755)
1 parent 7bec0fd commit 16a34d9

File tree

2 files changed

+27
-7
lines changed

2 files changed

+27
-7
lines changed

src/RESTController.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,8 @@ const RESTController = {
214214
promise.reject('Unable to connect to the Parse API');
215215
} else {
216216
// After the retry limit is reached, fail
217-
promise.reject(response);
217+
const error = await response.json();
218+
promise.reject(error);
218219
}
219220
} else {
220221
promise.reject(response);

src/__tests__/RESTController-test.js

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,19 +84,21 @@ describe('RESTController', () => {
8484
});
8585

8686
it('aborts after too many failures', async () => {
87-
expect.assertions(1);
87+
expect.assertions(3);
8888
mockFetch([
89-
{ status: 500 },
90-
{ status: 500 },
91-
{ status: 500 },
92-
{ status: 500 },
93-
{ status: 500 },
89+
{ status: 500, response: { code: 1, error: 'Internal server error.' } },
90+
{ status: 500, response: { code: 1, error: 'Internal server error.' } },
91+
{ status: 500, response: { code: 1, error: 'Internal server error.' } },
92+
{ status: 500, response: { code: 1, error: 'Internal server error.' } },
93+
{ status: 500, response: { code: 1, error: 'Internal server error.' } },
9494
{ status: 200, response: { success: true } },
9595
]);
9696
try {
9797
await RESTController.ajax('POST', 'users', {});
9898
} catch (fetchError) {
9999
expect(fetchError).not.toBe(undefined);
100+
expect(fetchError.code).toBe(1);
101+
expect(fetchError.error).toBe('Internal server error.');
100102
}
101103
});
102104

@@ -178,6 +180,23 @@ describe('RESTController', () => {
178180
}
179181
});
180182

183+
it('handles 5xx errors after retries', async () => {
184+
expect.assertions(2);
185+
mockFetch([
186+
{ status: 500, response: { code: 1, error: 'Internal server error.' } },
187+
{ status: 500, response: { code: 1, error: 'Internal server error.' } },
188+
{ status: 500, response: { code: 1, error: 'Internal server error.' } },
189+
{ status: 500, response: { code: 1, error: 'Internal server error.' } },
190+
{ status: 500, response: { code: 1, error: 'Internal server error.' } },
191+
]);
192+
try {
193+
await RESTController.request('GET', 'classes/MyObject', {}, {});
194+
} catch (error) {
195+
expect(error.code).toBe(1);
196+
expect(error.message).toBe('Internal server error.');
197+
}
198+
});
199+
181200
it('handles X-Parse-Job-Status-Id header', async () => {
182201
mockFetch([{ status: 200, response: { results: [] } }], headers);
183202
const response = await RESTController.request(

0 commit comments

Comments
 (0)