diff --git a/packages/node/src/handlers.ts b/packages/node/src/handlers.ts index 868cf7d5a6b2..f080b00275dc 100644 --- a/packages/node/src/handlers.ts +++ b/packages/node/src/handlers.ts @@ -338,7 +338,7 @@ interface TrpcMiddlewareArguments { * e.g. Express Request Handlers or Next.js SDK. */ export function trpcMiddleware(options: SentryTrpcMiddlewareOptions = {}) { - return function ({ path, type, next, rawInput }: TrpcMiddlewareArguments): T { + return async function ({ path, type, next, rawInput }: TrpcMiddlewareArguments): Promise { const hub = getCurrentHub(); const clientOptions = hub.getClient()?.getOptions(); const sentryTransaction = hub.getScope().getTransaction(); @@ -358,7 +358,36 @@ export function trpcMiddleware(options: SentryTrpcMiddlewareOptions = {}) { sentryTransaction.setContext('trpc', trpcContext); } - return next(); + function captureError(e: unknown): void { + captureException(e, scope => { + scope.addEventProcessor(event => { + addExceptionMechanism(event, { + handled: false, + }); + return event; + }); + + return scope; + }); + } + + try { + return await next(); + } catch (e: unknown) { + if (typeof e === 'object' && e) { + if ('code' in e) { + // Is likely TRPCError - we only want to capture internal server errors + if (e.code === 'INTERNAL_SERVER_ERROR') { + captureError(e); + } + } else { + // Is likely random error that bubbles up + captureError(e); + } + } + + throw e; + } }; }