diff --git a/packages/next-drupal/src/client.ts b/packages/next-drupal/src/client.ts index b1ad60eb..447e3f26 100644 --- a/packages/next-drupal/src/client.ts +++ b/packages/next-drupal/src/client.ts @@ -889,15 +889,21 @@ export class DrupalClient { withAuth: options.withAuth, }) - if (response.status && response.status.toString().startsWith("5")) { - throw new Error(`Server error.`) - } - if (!response?.ok) { - // Do not throw errors here. - // Otherwise next.js will catch error and throw a 500. - // We want a 404. - return null + // Do not throw errors here when response is 404. + if (response.status === 404) { + return null + } + + // Throw error in any other situation as response is not ok. + let errorMessage: string + try { + const responseJson = await response.json() + errorMessage = `${response.status} ${responseJson?.message}` + } catch (e) { + errorMessage = `${response.status} ${response.statusText}` + } + throw new Error(errorMessage) } const json = await response.json() diff --git a/packages/next-drupal/tests/DrupalClient/resource-methods.test.ts b/packages/next-drupal/tests/DrupalClient/resource-methods.test.ts index 51fc43b1..86392e16 100644 --- a/packages/next-drupal/tests/DrupalClient/resource-methods.test.ts +++ b/packages/next-drupal/tests/DrupalClient/resource-methods.test.ts @@ -836,6 +836,20 @@ describe("translatePath()", () => { expect(path).toBeNull() }) + test("throws error for server errors", async () => { + console.log(BASE_URL) + const client = new DrupalClient(BASE_URL) + + spyOnFetch({ + responseBody: { message: "mocked internal server error" }, + status: 500, + }) + + await expect(client.translatePath("/server-error")).rejects.toThrowError( + "500 mocked internal server error" + ) + }) + test("makes un-authenticated requests by default", async () => { const client = new DrupalClient(BASE_URL) const fetchSpy = jest.spyOn(client, "fetch")