home / skills / blader / claudeception / nextjs-server-side-error-debugging

nextjs-server-side-error-debugging skill

/examples/nextjs-server-side-error-debugging

This skill helps you debug Next.js server-side errors in getServerSideProps and getStaticProps by guiding you to terminal logs and robust handling.

npx playbooks add skill blader/claudeception --skill nextjs-server-side-error-debugging

Review the files below or copy the command above to add this skill to your agents.

Files (1)
SKILL.md
4.0 KB
---
name: nextjs-server-side-error-debugging
description: |
  Debug getServerSideProps and getStaticProps errors in Next.js. Use when: 
  (1) Page shows generic error but browser console is empty, (2) API routes 
  return 500 with no details, (3) Server-side code fails silently, (4) Error 
  only occurs on refresh not client navigation. Check terminal/server logs 
  instead of browser for actual error messages.
author: Claude Code
version: 1.0.0
date: 2024-01-15
---

# Next.js Server-Side Error Debugging

## Problem

Server-side errors in Next.js don't appear in the browser console, making debugging 
frustrating when you're looking in the wrong place. The browser shows a generic error 
page or 500 status, but no stack trace or useful error information appears in DevTools.

## Context / Trigger Conditions

This skill applies when:

- Page displays "Internal Server Error" or custom error page
- Browser console shows no errors, or only a generic fetch failure
- You're using `getServerSideProps`, `getStaticProps`, or API routes
- Error only occurs on page refresh or direct navigation (not client-side transitions)
- The error is intermittent and hard to reproduce in the browser

Common misleading symptoms:
- "Unhandled Runtime Error" modal that doesn't show the real cause
- Network tab shows 500 but response body is empty or generic
- Error disappears when you add console.log (timing issue)

## Solution

### Step 1: Check the Terminal

The actual error with full stack trace appears in the terminal where `npm run dev` 
or `next dev` is running. This is the **first place to look**.

```bash
# If you don't see the terminal, find the process
ps aux | grep next
# Or restart with visible output
npm run dev
```

### Step 2: Add Explicit Error Handling

For persistent debugging, wrap server-side code with try-catch:

```typescript
export async function getServerSideProps(context) {
  try {
    const data = await fetchSomething();
    return { props: { data } };
  } catch (error) {
    console.error('getServerSideProps error:', error);
    // Return error state instead of throwing
    return { props: { error: error.message } };
  }
}
```

### Step 3: For Production Errors

Check your hosting provider's logs:
- **Vercel**: Dashboard → Project → Logs (Functions tab)
- **AWS**: CloudWatch Logs
- **Netlify**: Functions tab in dashboard
- **Self-hosted**: Check your Node.js process logs

### Step 4: Common Causes

1. **Environment variables**: Missing in production but present locally
2. **Database connections**: Connection string issues, cold starts
3. **Import errors**: Server-only code accidentally imported on client
4. **Async/await**: Missing await on async operations
5. **JSON serialization**: Objects that can't be serialized (dates, functions)

## Verification

After checking the terminal, you should see:
- Full stack trace with file name and line number
- The actual error message (not generic 500)
- Variable values if you added console.log statements

## Example

**Symptom**: User reports page shows "Internal Server Error" after clicking a link.

**Investigation**:
1. Open browser DevTools → Console: Empty
2. Network tab shows: `GET /dashboard → 500`
3. Check terminal running `npm run dev`:

```
Error: Cannot read property 'id' of undefined
    at getServerSideProps (/app/pages/dashboard.tsx:15:25)
    at renderToHTML (/app/node_modules/next/dist/server/render.js:428:22)
```

**Cause found**: Database query returned `null` instead of user object.

## Notes

- In development, Next.js sometimes shows an error overlay, but it often has less 
  detail than the terminal output
- `reactStrictMode: true` in `next.config.js` causes double-execution of server 
  functions in development, which can make debugging confusing
- For API routes, the error appears in the same terminal as page errors
- Client-side errors (in useEffect, event handlers) DO appear in browser console—
  this skill only applies to server-side code
- If using `next start` (production mode locally), errors may be less verbose; 
  check `NODE_ENV` and consider adding custom error logging

Overview

This skill helps you debug server-side errors in Next.js pages and API routes when the browser shows a generic error but devtools are empty. It focuses on inspecting the server/terminal logs, adding targeted server-side error handling, and checking common causes like environment variables and imports. Use it to quickly find the real stack trace and root cause for getServerSideProps, getStaticProps, and API route failures.

How this skill works

The skill directs you to check the terminal where next dev or your production Node process runs, because Next.js prints full stack traces there. It also walks through adding try/catch around server-side functions, returning safe error props, and locating host-specific logs (Vercel, AWS, Netlify, self-hosted). Finally, it lists common failure modes and verification steps so you can confirm the issue is resolved.

When to use it

  • Page shows "Internal Server Error" but browser console has no useful stack trace
  • API route returns 500 with an empty or generic response body
  • Error occurs only on full page refresh or direct navigation, not client-side routing
  • Server-side code appears to fail silently or intermittently
  • You want the authoritative source of runtime errors (terminal/host logs) instead of DevTools

Best practices

  • Always check the terminal running npm run dev or next dev first for the full stack trace
  • Wrap getServerSideProps/getStaticProps and API handlers in try/catch and log errors to console
  • Return a safe error state from server functions instead of throwing in production
  • Verify environment variables and database connections in the environment where the error occurs
  • Avoid importing server-only modules into client bundles and watch for serialization issues (dates, functions)

Example use cases

  • A dashboard route returns 500 on refresh; terminal shows undefined property access in getServerSideProps
  • An API route works in client navigation but fails with 500 on direct fetch; host logs reveal missing env var
  • Intermittent production failures traced to cold DB connections visible in CloudWatch or Vercel function logs
  • Development overlay shows generic error but terminal reveals import error from a server-only package

FAQ

Why doesn't the browser show the real server error?

Browser DevTools only surface client-side errors; Next.js prints server-side stack traces to the terminal or host logs.

What if I don't have access to the host logs in production?

Add structured error logging (e.g., Sentry) or modify server handlers to return sanitized error details to a secure admin endpoint.