📖 Scenario: You are building a simple web server using Deno that responds to HTTP requests. You want to create a handler function that fetches data and returns it as a JSON response.
🎯 Goal: Build a Deno HTTP server with a handler function that fetches a list of users and returns it as a JSON response.
📋 What You'll Learn
Create an array of user objects with exact names and ages
Create a handler function named handler that returns the users as JSON
Start a Deno HTTP server on port 8000 using the handler function
Ensure the server responds with the correct JSON data when accessed
💡 Why This Matters
🌍 Real World
Creating simple web servers that respond with JSON data is common in building APIs and backend services.
💼 Career
Understanding how to handle HTTP requests and send JSON responses is essential for backend developers and full-stack engineers.
Progress0 / 4 steps
1
Create the users data array
Create a constant array called users with these exact objects: { name: "Alice", age: 30 }, { name: "Bob", age: 25 }, and { name: "Charlie", age: 35 }.
Deno
Hint
Use const users = [ ... ] with the exact objects inside.
2
Create the handler function
Create an async function called handler that takes a Request parameter and returns a new Response with the JSON string of users and the header { 'Content-Type': 'application/json' }.
Deno
Hint
Use async function handler(request: Request) and return a Response with JSON string and headers.
3
Start the HTTP server
Import serve from "https://deno.land/std@0.177.0/http/server.ts" and start the server on port 8000 by calling serve(handler, { port: 8000 }).
Deno
Hint
Use import { serve } from "https://deno.land/std@0.177.0/http/server.ts" and call serve(handler, { port: 8000 }).
4
Add a console log for server start
Add a console.log statement after starting the server that says exactly "Server running on http://localhost:8000".
Deno
Hint
Use console.log("Server running on http://localhost:8000") exactly.
Practice
(1/5)
1. What is the main purpose of using a handler function with serve in Deno for data fetching?
easy
A. To compile TypeScript code into JavaScript
B. To create a database connection automatically
C. To style the webpage with CSS
D. To process incoming requests and send back appropriate responses
Solution
Step 1: Understand the role of serve and handler
The serve function listens for incoming HTTP requests and uses the handler function to decide how to respond.
Step 2: Identify the handler's purpose
The handler processes each request and returns the correct response, such as data or status messages.
Final Answer:
To process incoming requests and send back appropriate responses -> Option D
Quick Check:
Handler processes requests = D [OK]
Hint: Handler functions decide responses for requests [OK]
Confusing handler with styling or compilation tasks
Assuming serve compiles code
2. Which of the following is the correct syntax to start a basic HTTP server in Deno using a handler function named handler?
easy
A. handler.serve();
B. serve(handler);
C. serve = handler();
D. serve->handler();
Solution
Step 1: Recall the serve function usage
In Deno, serve is called with the handler function as an argument to start the server.
Step 2: Check syntax correctness
The correct syntax is serve(handler); which passes the handler function properly.
Final Answer:
serve(handler); -> Option B
Quick Check:
serve called with handler function = C [OK]
Hint: Call serve with handler function name only [OK]
Common Mistakes:
Using assignment instead of function call
Trying to call serve as a method on handler
Using invalid arrow syntax
3. Given this handler code snippet in Deno:
async function handler(req) {
if (req.url.endsWith('/hello')) {
return new Response('Hello World');
}
return new Response('Not Found', { status: 404 });
}
What will the server respond when a request is made to http://localhost:8000/hello?
medium
A. A response with body 'Hello World'
B. A 404 Not Found response
C. An empty response with status 200
D. A runtime error occurs
Solution
Step 1: Analyze the URL condition in handler
The handler checks if the request URL ends with '/hello'. If yes, it returns 'Hello World'.
Step 2: Match the request URL
The request URL is exactly '/hello', so the condition is true and the response is 'Hello World'.
Final Answer:
A response with body 'Hello World' -> Option A
Quick Check:
URL ends with '/hello' returns 'Hello World' = B [OK]
Hint: Check URL endsWith condition to find response [OK]
Common Mistakes:
Assuming 404 because of missing else
Thinking response body is empty
Expecting runtime error from this code
4. Identify the error in this Deno handler code snippet:
async function handler(req) {
if (req.url === '/data') {
const data = await fetch('https://api.example.com/data');
return data.json();
}
return new Response('Not Found', { status: 404 });
}
medium
A. req.url should be req.path
B. Cannot use fetch inside handler
C. Missing await before data.json()
D. Response status 404 is invalid
Solution
Step 1: Understand fetch and response handling
The fetch returns a Response object; calling data.json() returns a Promise that must be awaited.
Step 2: Identify missing await
The code returns data.json() without awaiting it, which returns a Promise instead of a Response object.
Final Answer:
Missing await before data.json() -> Option C
Quick Check:
Await JSON parsing Promise = A [OK]
Hint: Always await async JSON parsing in handlers [OK]
Common Mistakes:
Thinking fetch is disallowed in handlers
Using req.path instead of req.url
Believing 404 status is invalid
5. You want to create a Deno server that fetches user data from an external API only when the request URL is /user. Which handler function correctly fetches the JSON data and returns it as a JSON response?
hard
A. async function handler(req) {
if (req.url.endsWith('/user')) {
const response = await fetch('https://api.example.com/user');
const data = await response.json();
return new Response(JSON.stringify(data), { headers: { 'Content-Type': 'application/json' } });
}
return new Response('Not Found', { status: 404 });
}
B. async function handler(req) {
if (req.url === '/user') {
const data = fetch('https://api.example.com/user').json();
return new Response(data);
}
return new Response('Not Found');
}
C. function handler(req) {
if (req.url === '/user') {
const data = await fetch('https://api.example.com/user').json();
return new Response(JSON.stringify(data));
}
return new Response('Not Found');
}
D. async function handler(req) {
if (req.url.includes('/user')) {
const response = await fetch('https://api.example.com/user');
return response.json();
}
return new Response('Not Found', { status: 404 });
}
Solution
Step 1: Check correct async handling and URL matching
async function handler(req) {
if (req.url.endsWith('/user')) {
const response = await fetch('https://api.example.com/user');
const data = await response.json();
return new Response(JSON.stringify(data), { headers: { 'Content-Type': 'application/json' } });
}
return new Response('Not Found', { status: 404 });
} uses endsWith('/user') to match URL and awaits both fetch and response.json(), which is correct.
Step 2: Verify response formatting
async function handler(req) {
if (req.url.endsWith('/user')) {
const response = await fetch('https://api.example.com/user');
const data = await response.json();
return new Response(JSON.stringify(data), { headers: { 'Content-Type': 'application/json' } });
}
return new Response('Not Found', { status: 404 });
} returns a new Response with JSON string and correct Content-Type header, ensuring proper JSON response.
Final Answer:
Option A correctly fetches and returns JSON data with proper async handling and headers -> Option A
Quick Check:
Await fetch and json, set JSON header = A [OK]
Hint: Await fetch and json, set JSON content-type header [OK]
Common Mistakes:
Not awaiting response.json()
Returning raw Promise instead of Response
Missing Content-Type header for JSON
Using non-async function with await
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.