diff --git a/src/RESTController.ts b/src/RESTController.ts index d9c225439..8671feb96 100644 --- a/src/RESTController.ts +++ b/src/RESTController.ts @@ -214,7 +214,8 @@ const RESTController = { promise.reject('Unable to connect to the Parse API'); } else { // After the retry limit is reached, fail - promise.reject(response); + const error = await response.json(); + promise.reject(error); } } else { promise.reject(response); diff --git a/src/__tests__/RESTController-test.js b/src/__tests__/RESTController-test.js index aa868689f..43ecfb45d 100644 --- a/src/__tests__/RESTController-test.js +++ b/src/__tests__/RESTController-test.js @@ -84,19 +84,21 @@ describe('RESTController', () => { }); it('aborts after too many failures', async () => { - expect.assertions(1); + expect.assertions(3); mockFetch([ - { status: 500 }, - { status: 500 }, - { status: 500 }, - { status: 500 }, - { status: 500 }, + { status: 500, response: { code: 1, error: 'Internal server error.' } }, + { status: 500, response: { code: 1, error: 'Internal server error.' } }, + { status: 500, response: { code: 1, error: 'Internal server error.' } }, + { status: 500, response: { code: 1, error: 'Internal server error.' } }, + { status: 500, response: { code: 1, error: 'Internal server error.' } }, { status: 200, response: { success: true } }, ]); try { await RESTController.ajax('POST', 'users', {}); } catch (fetchError) { expect(fetchError).not.toBe(undefined); + expect(fetchError.code).toBe(1); + expect(fetchError.error).toBe('Internal server error.'); } }); @@ -178,6 +180,23 @@ describe('RESTController', () => { } }); + it('handles 5xx errors after retries', async () => { + expect.assertions(2); + mockFetch([ + { status: 500, response: { code: 1, error: 'Internal server error.' } }, + { status: 500, response: { code: 1, error: 'Internal server error.' } }, + { status: 500, response: { code: 1, error: 'Internal server error.' } }, + { status: 500, response: { code: 1, error: 'Internal server error.' } }, + { status: 500, response: { code: 1, error: 'Internal server error.' } }, + ]); + try { + await RESTController.request('GET', 'classes/MyObject', {}, {}); + } catch (error) { + expect(error.code).toBe(1); + expect(error.message).toBe('Internal server error.'); + } + }); + it('handles X-Parse-Job-Status-Id header', async () => { mockFetch([{ status: 200, response: { results: [] } }], headers); const response = await RESTController.request(