From 32ed95e1ee87409db234f1b7bd6d2e462fd9ed5d Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Wed, 21 Feb 2024 16:44:16 -0500 Subject: [PATCH] fix: handle thrown errors in config-level afterError hook (#5147) --- .../payload/src/express/middleware/errorHandler.ts | 2 +- test/hooks/config.ts | 13 +++++++++++++ test/hooks/int.spec.ts | 9 +++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/packages/payload/src/express/middleware/errorHandler.ts b/packages/payload/src/express/middleware/errorHandler.ts index 4790b79cb5..2cbf70384a 100644 --- a/packages/payload/src/express/middleware/errorHandler.ts +++ b/packages/payload/src/express/middleware/errorHandler.ts @@ -56,7 +56,7 @@ const errorHandler = err, response, req.context, - req.collection.config, + null, )) || { response, status, diff --git a/test/hooks/config.ts b/test/hooks/config.ts index c28fb4ca83..c135d68bc6 100644 --- a/test/hooks/config.ts +++ b/test/hooks/config.ts @@ -1,5 +1,6 @@ import type { SanitizedConfig } from '../../packages/payload/src/config/types' +import { APIError } from '../../packages/payload/errors' import { buildConfigWithDefaults } from '../buildConfigWithDefaults' import AfterOperation from './collections/AfterOperation' import ChainingHooks from './collections/ChainingHooks' @@ -24,6 +25,18 @@ export const HooksConfig: Promise = buildConfigWithDefaults({ DataHooks, ], globals: [DataHooksGlobal], + endpoints: [ + { + path: '/throw-to-after-error', + method: 'get', + handler: () => { + throw new APIError("I'm a teapot", 418) + }, + }, + ], + hooks: { + afterError: () => console.log('Running afterError hook'), + }, onInit: async (payload) => { await seedHooksUsers(payload) await payload.create({ diff --git a/test/hooks/int.spec.ts b/test/hooks/int.spec.ts index 48bf7b4b76..4864c38f67 100644 --- a/test/hooks/int.spec.ts +++ b/test/hooks/int.spec.ts @@ -462,4 +462,13 @@ describe('Hooks', () => { expect(doc.field_globalAndField).toStrictEqual(globalAndFieldString + globalAndFieldString) }) }) + + describe('config level after error hook', () => { + it('should handle error', async () => { + const response = await fetch(`${apiUrl}/throw-to-after-error`) + const body = await response.json() + expect(response.status).toEqual(418) + expect(body).toEqual({ errors: [{ message: "I'm a teapot" }] }) + }) + }) })