Bird
Raised Fist0
NextJSframework~10 mins

Response formatting in NextJS - Step-by-Step Execution

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Concept Flow - Response formatting
Request Received
Process Request Handler
Create Response Object
Set Headers & Status
Format Response Body
Send Response to Client
End
This flow shows how Next.js API routes receive a request, format the response with headers and body, then send it back to the client.
Execution Sample
NextJS
export async function GET() {
  return new Response(JSON.stringify({ message: 'Hello' }), {
    status: 200,
    headers: { 'Content-Type': 'application/json' }
  })
}
This code handles a GET request and returns a JSON response with status 200 and proper content-type header.
Execution Table
StepActionDetailsResult
1Receive GET requestClient calls API endpointRequest object created
2Execute GET handlerRuns exported GET functionResponse object created
3Format response bodyJSON.stringify({ message: 'Hello' }){"message":"Hello"}
4Set status and headersstatus=200, Content-Type=application/jsonResponse ready with headers
5Send responseResponse sent to clientClient receives JSON with message
6EndRequest handled fullyConnection closed
💡 Response sent and connection closed, request lifecycle complete
Variable Tracker
VariableStartAfter Step 2After Step 3After Step 4Final
requestundefinedRequest objectRequest objectRequest objectRequest object
responseundefinedResponse objectResponse object with bodyResponse object with headersResponse object sent
Key Moments - 2 Insights
Why do we use JSON.stringify in the response body?
Because the Response body must be a string or a stream. JSON.stringify converts the JavaScript object into a JSON string, as shown in execution_table step 3.
What happens if we forget to set the Content-Type header?
The client might not interpret the response as JSON. Setting 'Content-Type: application/json' in step 4 ensures the client knows how to read the response.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the response body after step 3?
A{"message":"Hello"}
B{ message: 'Hello' }
C"Hello"
Dundefined
💡 Hint
Check the 'Result' column in row for step 3 in execution_table
At which step is the Content-Type header set?
AStep 2
BStep 3
CStep 4
DStep 5
💡 Hint
Look at the 'Action' and 'Details' columns in execution_table step 4
If we change status to 404, which step changes in the execution table?
AStep 3
BStep 4
CStep 5
DStep 6
💡 Hint
Status is set in step 4 under 'Set status and headers'
Concept Snapshot
Next.js API response formatting:
- Use Response object to send data
- Body must be string or stream (use JSON.stringify for JSON)
- Set status code (e.g., 200)
- Set headers (e.g., Content-Type)
- Return Response from handler
- Client receives formatted response
Full Transcript
In Next.js, when an API route receives a request, it runs the handler function like GET. The handler creates a Response object with a body, status, and headers. The body is usually a string, so we use JSON.stringify to convert objects to JSON strings. We set the status code to tell the client if the request was successful. Headers like Content-Type tell the client how to read the response. Finally, the Response is sent back to the client, completing the request cycle.

Practice

(1/5)
1. What is the main purpose of setting the Content-Type header in a Next.js API response?
easy
A. To set the status code of the response
B. To specify the HTTP method used in the request
C. To define the URL path of the API endpoint
D. To tell the client what type of data is being sent

Solution

  1. Step 1: Understand the role of headers in HTTP responses

    Headers provide metadata about the response, including data format.
  2. Step 2: Identify the purpose of Content-Type

    This header tells the client how to interpret the response body, e.g., JSON or HTML.
  3. Final Answer:

    To tell the client what type of data is being sent -> Option D
  4. Quick Check:

    Content-Type = Data format info [OK]
Hint: Content-Type always describes the data format sent [OK]
Common Mistakes:
  • Confusing Content-Type with HTTP method
  • Thinking Content-Type sets status code
  • Mixing URL path with headers
2. Which of the following is the correct way to create a JSON response with status 200 in a Next.js API route?
easy
A. return new Response(data, { statusCode: 200, contentType: 'application/json' })
B. return Response(data, 200, { 'Content-Type': 'application/json' })
C. return new Response(JSON.stringify(data), { status: 200, headers: { 'Content-Type': 'application/json' } })
D. return new Response(JSON.stringify(data), 200, { 'Content-Type': 'text/plain' })

Solution

  1. Step 1: Check the Response constructor syntax

    It takes the body as first argument, and an options object with status and headers.
  2. Step 2: Verify correct headers and status usage

    Headers must include 'Content-Type' with 'application/json' for JSON data, and status should be 200.
  3. Final Answer:

    return new Response(JSON.stringify(data), { status: 200, headers: { 'Content-Type': 'application/json' } }) -> Option C
  4. Quick Check:

    Response(body, {status, headers}) = return new Response(JSON.stringify(data), { status: 200, headers: { 'Content-Type': 'application/json' } }) [OK]
Hint: Use new Response with JSON.stringify and proper headers [OK]
Common Mistakes:
  • Passing data directly without JSON.stringify
  • Using wrong header keys like contentType
  • Incorrect argument order in Response
3. Consider this Next.js API handler code snippet:
export async function GET() {
  const data = { message: 'Hello' };
  return new Response(JSON.stringify(data), {
    status: 201,
    headers: { 'Content-Type': 'application/json' }
  });
}

What will be the HTTP status code and response body sent to the client?
medium
A. Status 201 with body '{"message":"Hello"}'
B. Status 200 with body '{"message":"Hello"}'
C. Status 201 with body 'Hello'
D. Status 200 with body 'Hello'

Solution

  1. Step 1: Identify the status code set in the Response

    The code sets status to 201 explicitly in the Response options.
  2. Step 2: Check the response body content

    The body is JSON.stringify(data), which converts { message: 'Hello' } to '{"message":"Hello"}'.
  3. Final Answer:

    Status 201 with body '{"message":"Hello"}' -> Option A
  4. Quick Check:

    Status and JSON body match Status 201 with body '{"message":"Hello"}' [OK]
Hint: Look for status in Response options and JSON.stringify body [OK]
Common Mistakes:
  • Assuming default status 200 instead of 201
  • Confusing raw string with JSON string
  • Ignoring JSON.stringify usage
4. You wrote this Next.js API handler:
export async function POST() {
  const data = { success: true };
  return new Response(data, {
    status: 200,
    headers: { 'Content-Type': 'application/json' }
  });
}

What is the problem with this code?
medium
A. Headers object is missing required 'Accept' header
B. Response body must be a string or Blob, not an object
C. Status code 200 is invalid for POST requests
D. The function should not be async

Solution

  1. Step 1: Check the Response body type

    The Response constructor expects a string, Blob, or similar, not a plain object.
  2. Step 2: Identify the fix

    The object must be converted to a string using JSON.stringify before passing to Response.
  3. Final Answer:

    Response body must be a string or Blob, not an object -> Option B
  4. Quick Check:

    Response body type error = Response body must be a string or Blob, not an object [OK]
Hint: Always JSON.stringify objects before sending in Response body [OK]
Common Mistakes:
  • Passing raw objects directly to Response
  • Thinking status 200 is invalid for POST
  • Adding unnecessary headers like Accept
5. You want to send a plain text response with status 404 from a Next.js API route. Which code snippet correctly formats this response?
hard
A. return new Response('Not Found', { status: 404, headers: { 'Content-Type': 'text/plain' } })
B. return new Response({ message: 'Not Found' }, { status: 404, headers: { 'Content-Type': 'application/json' } })
C. return new Response('Not Found', 404, { 'Content-Type': 'text/plain' })
D. return Response('Not Found', { status: 404, contentType: 'text/plain' })

Solution

  1. Step 1: Confirm Response constructor usage

    It takes the body string first, then an options object with status and headers.
  2. Step 2: Verify correct headers and status for plain text

    Status 404 is correct for 'Not Found', and Content-Type must be 'text/plain' for plain text.
  3. Final Answer:

    return new Response('Not Found', { status: 404, headers: { 'Content-Type': 'text/plain' } }) -> Option A
  4. Quick Check:

    Plain text + 404 status + correct headers = return new Response('Not Found', { status: 404, headers: { 'Content-Type': 'text/plain' } }) [OK]
Hint: Use string body with status and 'text/plain' header [OK]
Common Mistakes:
  • Passing object instead of string for plain text
  • Wrong argument order in Response
  • Using contentType instead of headers key