Bird
Raised Fist0
Svelteframework~10 mins

Server routes (+server.js) in Svelte - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Server routes (+server.js)
Client sends HTTP request
↓
Server route matches URL
↓
+server.js handles request
↓
Process request logic
↓
Send response back to client
↓
Client receives response
This flow shows how a client request is matched to a server route in SvelteKit, handled by +server.js, and then a response is sent back.
Execution Sample
Svelte
export async function GET() {
  return new Response('Hello from server route!');
}
A simple GET server route that responds with a text message.
Execution Table
StepActionInput/ConditionOutput/Result
1Client sends GET request to /exampleURL: /exampleRequest received by server
2Server matches routeRoute file: +server.js in /example folderRoute handler selected
3Execute GET functionNo input parametersReturns Response with body 'Hello from server route!'
4Server sends responseResponse objectClient receives text 'Hello from server route!'
5Client displays responseResponse textUser sees message on screen
6EndNo more stepsRequest cycle complete
💡 Request handled and response sent, no further processing needed
Variable Tracker
VariableStartAfter Step 3Final
requestundefinedGET request objectGET request object
responseundefinedResponse('Hello from server route!')Response('Hello from server route!')
Key Moments - 3 Insights
Why does the server route file have to be named +server.js?
Because SvelteKit uses the +server.js filename to identify server route handlers, as shown in step 2 of the execution_table.
What happens if the GET function does not return a Response?
The server will not send a proper response, causing errors or timeouts. Step 3 shows the GET function must return a Response object.
Can the server route handle other HTTP methods besides GET?
Yes, you can export functions like POST, PUT, DELETE in +server.js to handle those methods, similar to the GET function in step 3.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the output of step 3?
AA Response object with text 'Hello from server route!'
BAn error message
CUndefined
DA redirect instruction
💡 Hint
Check the 'Output/Result' column in step 3 of the execution_table
At which step does the server decide which route handler to use?
AStep 1
BStep 2
CStep 4
DStep 5
💡 Hint
Look at the 'Action' column to find when route matching happens
If the GET function returned a JSON response instead of text, how would step 3's output change?
AResponse with empty body
BResponse with text 'Hello from server route!'
CResponse with JSON body
DNo response returned
💡 Hint
Consider what the GET function returns in step 3 and how changing the body affects the response
Concept Snapshot
Server routes in SvelteKit use +server.js files.
Export functions like GET handle HTTP methods.
Return a Response object to send data.
Server matches URL to route file.
Response is sent back to client.
This enables backend logic inside Svelte apps.
Full Transcript
In SvelteKit, server routes are defined by creating a +server.js file inside a route folder. When a client sends an HTTP request, the server matches the URL to the correct route folder and runs the exported function for the HTTP method, like GET. This function returns a Response object with the data to send back. The server then sends this response to the client, completing the request cycle. This allows you to write backend code alongside your frontend in SvelteKit.

Practice

(1/5)
1. What is the main purpose of a +server.js file in a SvelteKit project?
easy
A. To style the application using CSS
B. To define client-side UI components
C. To manage database connections directly in the browser
D. To handle server-side HTTP requests like GET or POST

Solution

  1. Step 1: Understand the role of +server.js

    This file is used to write server-side code that responds to HTTP requests.
  2. Step 2: Differentiate client and server roles

    Client-side UI components and styling are handled elsewhere, not in +server.js.
  3. Final Answer:

    To handle server-side HTTP requests like GET or POST -> Option D
  4. Quick Check:

    Server routes = handle HTTP requests [OK]
Hint: Remember: +server.js is for server code only [OK]
Common Mistakes:
  • Confusing +server.js with client components
  • Thinking CSS or styling goes in +server.js
  • Assuming database code runs in the browser
2. Which of the following is the correct way to export a GET handler in a +server.js file?
easy
A. export async function get() { return { body: { message: 'Hello' } }; }
B. export function get() { return { body: { message: 'Hello' } }; }
C. export async function GET() { return { body: { message: 'Hello' } }; }
D. export async get() { return { body: { message: 'Hello' } }; }

Solution

  1. Step 1: Recall SvelteKit server route syntax

    Handlers must be exported as async functions named in uppercase HTTP methods, e.g., GET.
  2. Step 2: Check syntax correctness

    Only export async function GET() { return { body: { message: 'Hello' } }; } uses export async function GET() which is correct syntax.
  3. Final Answer:

    export async function GET() { return { body: { message: 'Hello' } }; } -> Option C
  4. Quick Check:

    Use uppercase HTTP method names for exports [OK]
Hint: Export async functions named uppercase HTTP methods [OK]
Common Mistakes:
  • Using lowercase method names like 'get' instead of 'GET'
  • Omitting async keyword for async handlers
  • Incorrect export syntax without 'function'
3. Given this +server.js code, what will be the JSON response body when a GET request is made?
export async function GET() {
  return {
    status: 200,
    body: { success: true, data: [1, 2, 3] }
  };
}
medium
A. {"success":true,"data":[1,2,3]}
B. {"status":200,"body":{"success":true,"data":[1,2,3]}}
C. [1, 2, 3]
D. An error because body must be a string

Solution

  1. Step 1: Understand the returned object structure

    The handler returns an object with status and body. The body is the JSON data sent to the client.
  2. Step 2: Identify the actual response body content

    The client receives the body content serialized as JSON: {"success":true,"data":[1,2,3]}.
  3. Final Answer:

    {"success":true,"data":[1,2,3]} -> Option A
  4. Quick Check:

    Response body = JSON data object [OK]
Hint: Response body is the JSON object inside returned body [OK]
Common Mistakes:
  • Confusing the whole return object with the response body
  • Expecting raw arrays or strings instead of JSON objects
  • Thinking status code is part of JSON body
4. What is wrong with this +server.js POST handler?
export async function POST(request) {
  const data = await request.json();
  return { status: 201, body: { received: data } };
}
medium
A. Nothing is wrong; this is correct syntax
B. The request parameter is missing the 'event' wrapper
C. The handler must return a Response object, not a plain object
D. The function should be named post in lowercase

Solution

  1. Step 1: Check handler parameter

    The POST handler receives an event object containing request. The code names it request but calls request.json(), which fails because the event object has no json() method; use event.request.json() or destructure { request }.
  2. Step 2: Identify the correct fix

    The parameter needs destructuring like POST({ request }) or renaming to event with event.request. The request parameter is missing the 'event' wrapper correctly identifies the missing 'event' wrapper.
  3. Final Answer:

    The request parameter is missing the 'event' wrapper -> Option B
  4. Quick Check:

    Destructure { request } from event [OK]
Hint: Destructure { request } from event parameter [OK]
Common Mistakes:
  • Using lowercase method names instead of uppercase
  • Expecting a Response object instead of plain object
  • Misunderstanding request parameter structure
5. You want to create a +server.js route that accepts a POST request with JSON data, validates that the JSON has a non-empty name string, and returns a 400 error if invalid. Which code snippet correctly implements this?
hard
A. export async function POST({ request }) { const data = await request.json(); if (!data.name || typeof data.name !== 'string' || data.name.trim() === '') { return { status: 400, body: { error: 'Name is required' } }; } return { status: 200, body: { message: `Hello, ${data.name}` } }; }
B. export async function POST(request) { const data = await request.json(); if (!data.name) { throw new Error('Name missing'); } return new Response(JSON.stringify({ message: `Hello, ${data.name}` }), { status: 200 }); }
C. export async function POST({ request }) { const data = await request.json(); if (data.name === '') { return { status: 500, body: { error: 'Empty name' } }; } return { status: 200, body: { message: `Hi ${data.name}` } }; }
D. export async function POST({ request }) { const data = await request.json(); if (!data.name) { return { status: 404, body: { error: 'Name not found' } }; } return { status: 200, body: { message: `Welcome, ${data.name}` } }; }

Solution

  1. Step 1: Validate the 'name' field properly

    The correct snippet destructures { request }, checks if name exists, is a string, and non-empty after trim(), returning 400 if invalid.
  2. Step 2: Confirm status codes and completeness

    It uses 400 for validation errors and 200 for success; others use wrong parameters, incomplete checks, wrong statuses (500/404), or throw errors.
  3. Final Answer:

    The snippet with full validation (exists, string, trimmed non-empty) and 400 status -> Option A
  4. Quick Check:

    Validate input and return 400 if invalid [OK]
Hint: Check for empty or missing fields, return 400 for bad input [OK]
Common Mistakes:
  • Returning wrong status codes like 404 or 500 for validation errors
  • Throwing errors instead of returning HTTP responses
  • Not trimming strings before checking emptiness
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard