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
Recall & Review
beginner
What is a server component in Next.js?
A server component in Next.js is a React component that runs only on the server. It can fetch data directly from a database or API before sending the rendered HTML to the client, improving performance and security.
Click to reveal answer
beginner
Why should database queries be done inside server components in Next.js?
Database queries inside server components keep sensitive data on the server, reduce client bundle size, and allow faster page loads by sending pre-rendered HTML with data already fetched.
Click to reveal answer
intermediate
How do you import and use a database client inside a Next.js server component?
You import the database client (like Prisma or a custom client) at the top of the server component file and call its query methods directly inside the component's async function before returning JSX.
Click to reveal answer
intermediate
What is the benefit of using async/await in server components for database queries?
Using async/await lets the server component wait for the database query to finish before rendering. This ensures the component has all data ready, so the user sees the complete page immediately.
Click to reveal answer
beginner
Can server components in Next.js access environment variables for database credentials?
Yes, server components can safely access environment variables because they run only on the server. This keeps database credentials secure and hidden from the client.
Click to reveal answer
Where do server components in Next.js run?
AOn the server only
BOn the client only
CBoth client and server
DIn the browser's local storage
✗ Incorrect
Server components run only on the server, allowing them to fetch data securely and send pre-rendered HTML to the client.
Why is it better to fetch database data inside server components?
ATo slow down page loading
BTo increase client bundle size
CTo keep data fetching hidden from the client
DTo expose database credentials to users
✗ Incorrect
Fetching data inside server components keeps database queries and credentials hidden from the client, improving security.
Which syntax is commonly used to wait for database queries in server components?
AsetTimeout
Bpromises without await
Ccallbacks
Dasync/await
✗ Incorrect
Async/await syntax makes it easy to write code that waits for database queries to finish before rendering.
Can server components access environment variables in Next.js?
ANo, only client components can
BYes, because they run on the server
COnly if variables are public
DOnly in development mode
✗ Incorrect
Server components run on the server and can safely access environment variables like database credentials.
What happens if you try to run a database query inside a client component?
AIt may expose sensitive data to the user
BIt runs faster than server components
CIt is the recommended way
DIt automatically hides credentials
✗ Incorrect
Running database queries in client components risks exposing sensitive data and credentials to users.
Explain how server components in Next.js handle database queries and why this is beneficial.
Think about where the code runs and what the user sees.
You got /5 concepts.
Describe the steps to fetch data from a database inside a Next.js server component.
Focus on code structure and data flow.
You got /5 concepts.
Practice
(1/5)
1. What is the main advantage of using server components in Next.js for database queries?
easy
A. They fetch data securely on the server without exposing credentials to the client.
B. They allow direct database access from the browser.
C. They require no async/await syntax for queries.
D. They automatically cache data on the client side.
Solution
Step 1: Understand server components role
Server components run on the server, so they can safely access databases without exposing secrets to the client.
Step 2: Compare options
Only They fetch data securely on the server without exposing credentials to the client. correctly states the security advantage. Options A, C, and D are incorrect because database access is not done in the browser, async/await is needed, and caching is not automatic on client side.
Final Answer:
They fetch data securely on the server without exposing credentials to the client. -> Option A
Quick Check:
Server components = secure server data fetching [OK]
Hint: Server components run on server, so data stays secure there [OK]
Common Mistakes:
Thinking database queries run in the browser
Ignoring async/await for fetching data
Assuming client-side caching is automatic
2. Which of the following is the correct way to fetch data from a database inside a Next.js server component?
easy
A. const data = await db.query('SELECT * FROM users')
B. const data = fetch('api/data')
C. const data = db.query('SELECT * FROM users')
D. const data = useEffect(() => db.query('SELECT * FROM users'), [])
Solution
Step 1: Identify async database query syntax
Database queries inside server components must use async/await to wait for the query result.
Step 2: Evaluate options
const data = await db.query('SELECT * FROM users') uses await correctly. const data = fetch('api/data') uses fetch which is client-side. const data = db.query('SELECT * FROM users') misses await, so it returns a promise. const data = useEffect(() => db.query('SELECT * FROM users'), []) uses useEffect, which is a client hook and invalid in server components.
Final Answer:
const data = await db.query('SELECT * FROM users') -> Option A
Quick Check:
Async query = await db.query(...) [OK]
Hint: Use await with db queries inside async server components [OK]
Common Mistakes:
Omitting await causing unresolved promises
Using client hooks like useEffect in server components
Using fetch instead of direct DB queries
3. Given this Next.js server component code, what will be rendered if the database returns [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]?
export default async function Users() {
const users = await db.query('SELECT id, name FROM users');
return (
<ul>
{users.map(user => <li key={user.id}>{user.name}</li>)}
</ul>
);
}
medium
A.
1
2
B.
Alice
Bob
C. Error: users.map is not a function
D.
{user.name}
{user.name}
Solution
Step 1: Understand data and rendering
The database returns an array of user objects with id and name. The component maps over users and renders each name inside <li>.
Step 2: Check output correctness
Alice
Bob
correctly shows the list with names Alice and Bob.
1
2
shows ids instead of names. Error: users.map is not a function would happen if users was not an array.
{user.name}
{user.name}
shows JSX code as text, which is incorrect.
Final Answer:
<ul><li>Alice</li><li>Bob</li></ul> -> Option B
Quick Check:
Mapping array to list items = names shown [OK]
Hint: Map array to JSX list to render names correctly [OK]
Common Mistakes:
Rendering ids instead of names
Forgetting to use key prop in list items
Trying to render raw objects instead of properties
4. Identify the error in this Next.js server component fetching data from a database:
export default function Products() {
const products = await db.query('SELECT * FROM products');
return (
<div>{products.length} products found</div>
);
}
medium
A. products.length is invalid for query result
B. Cannot use await inside server components
C. Missing async keyword on the component function
D. db.query should be inside useEffect hook
Solution
Step 1: Check async usage in server component
Await can only be used inside async functions. The component lacks the async keyword.
Step 2: Validate other options
Cannot use await inside server components is wrong because await is allowed in server components if async is used. db.query should be inside useEffect hook is wrong because useEffect is client-only. products.length is invalid for query result is wrong because products is expected to be an array with length.
Final Answer:
Missing async keyword on the component function -> Option C
Quick Check:
Await requires async function [OK]
Hint: Add async before function to use await inside [OK]
Common Mistakes:
Forgetting async keyword on server component
Using client hooks like useEffect in server components
Assuming query result is not an array
5. You want to fetch user data and their posts in a Next.js server component. Which approach correctly fetches both from the database before rendering?
export default async function UserPosts() {
const user = await db.query('SELECT * FROM users WHERE id = 1');
const posts = await db.query('SELECT * FROM posts WHERE userId = 1');
return (
<section>
<h1>{user.name}</h1>
<ul>
{posts.map(post => <li key={post.id}>{post.title}</li>)}
</ul>
</section>
);
}
What is the best way to optimize these queries?
hard
A. Fetch posts on the client side using useEffect
B. Run the second query inside the map function for posts
C. Combine both queries into one SQL join query
D. Run both queries in parallel using Promise.all before rendering
Solution
Step 1: Understand query optimization
Running queries sequentially waits for the first before starting the second, slowing response.
Step 2: Evaluate options for optimization
Run both queries in parallel using Promise.all before rendering runs both queries in parallel with Promise.all, improving speed. Run the second query inside the map function for posts runs queries inside map, causing many queries (bad). Fetch posts on the client side using useEffect moves fetching to client, losing server benefits. Combine both queries into one SQL join query is possible but may complicate data handling.
Final Answer:
Run both queries in parallel using Promise.all before rendering -> Option D
Quick Check:
Parallel queries = faster data fetching [OK]
Hint: Use Promise.all to fetch multiple queries simultaneously [OK]
Common Mistakes:
Running queries one after another sequentially
Fetching data inside loops causing many queries
Moving server data fetching to client side unnecessarily