📖 Scenario: You want to prepare your Astro project to run on your own server using Node.js. This means setting up the right adapter so your site can be served with Node.js instead of a static host.
🎯 Goal: Set up the Node.js adapter in your Astro project configuration to enable self-hosting on a Node.js server.
📋 What You'll Learn
Create an Astro configuration file named astro.config.mjs.
Import the Node.js adapter from @astrojs/node.
Set the adapter property to node() in the exported config.
Export the configuration as the default export.
💡 Why This Matters
🌍 Real World
Many developers want to host their Astro sites on their own servers or VPS using Node.js. Setting up the Node.js adapter is the first step to make this possible.
💼 Career
Knowing how to configure Astro for different hosting environments is valuable for frontend developers and full-stack engineers working with modern static site generators and server-side rendering.
Progress0 / 4 steps
1
Create the Astro config file
Create a file named astro.config.mjs and start by exporting an empty configuration object named config.
Astro
Hint
This file tells Astro how to build your project. Start with an empty config object.
2
Import the Node.js adapter
At the top of astro.config.mjs, import node from '@astrojs/node'.
Astro
Hint
This adapter lets Astro build your site to run on Node.js servers.
3
Add the Node.js adapter to the config
Add an adapter property to the config object and set it to node().
Astro
Hint
This tells Astro to use the Node.js adapter when building your project.
4
Export the config as default
Change the export to be the default export by writing export default config at the end of astro.config.mjs.
Astro
Hint
Astro expects the config to be the default export for it to work properly.
Practice
(1/5)
1. What is the main purpose of the Node.js adapter in Astro?
easy
A. To convert Astro sites into mobile apps automatically
B. To run Astro sites on your own server using Node.js
C. To deploy Astro sites only on static hosting platforms
D. To generate CSS styles for Astro components
Solution
Step 1: Understand the role of the Node.js adapter
The Node.js adapter allows Astro sites to be run on a Node.js server, enabling self-hosting.
Step 2: Compare options with this purpose
Only To run Astro sites on your own server using Node.js correctly describes running Astro sites on your own server using Node.js.
Final Answer:
To run Astro sites on your own server using Node.js -> Option B
Quick Check:
Node.js adapter = run Astro on own server [OK]
Hint: Node.js adapter = self-host Astro site with Node.js [OK]
Common Mistakes:
Thinking adapter only deploys static sites
Confusing adapter with mobile app tools
Assuming adapter generates CSS
2. Which configuration correctly sets up Astro to use the Node.js adapter for self-hosting?
easy
A. { output: 'static', adapter: static() }
B. { output: 'static', adapter: node() }
C. { output: 'server', adapter: static() }
D. { output: 'server', adapter: node() }
Solution
Step 1: Identify required output setting for Node.js adapter
Node.js adapter requires output: 'server' to enable server-side rendering.
Hint: Node.js adapter always needs output set to 'server' [OK]
Common Mistakes:
Using output 'static' with Node.js adapter
Mixing static adapter with server output
Forgetting to call node() function
3. Given this Astro config snippet, what happens when you run node ./dist/server/entry.mjs after building?
{
output: 'server',
adapter: node()
}
medium
A. The site runs on a Node.js server allowing dynamic requests
B. The site builds static files only, no server runs
C. An error occurs because adapter is missing
D. The site runs but only serves static HTML files
Solution
Step 1: Understand build output with Node.js adapter
With output: 'server' and adapter: node(), Astro builds a server-ready app.
Step 2: Running node ./dist/server/entry.mjs starts the Node.js server
This command launches the server to handle dynamic requests.
Final Answer:
The site runs on a Node.js server allowing dynamic requests -> Option A
Quick Check:
Node.js adapter + output 'server' = dynamic server run [OK]
Hint: Run entry.mjs with Node to start server for dynamic site [OK]
Common Mistakes:
Assuming static files only are built
Expecting error without adapter
Thinking server serves only static HTML
4. You set output: 'server' but forgot to add adapter: node() in your Astro config. What happens when you try to build?
medium
A. Build produces static files ignoring server output
B. Build succeeds but site cannot run on Node.js server
C. Build fails with an error about missing adapter
D. Build succeeds and site runs normally on Node.js
Solution
Step 1: Check requirement for server output
When output: 'server' is set, an adapter like node() is required to handle server build.
Step 2: Missing adapter causes build error
Without adapter: node(), the build process fails with an error indicating the missing adapter.
Final Answer:
Build fails with an error about missing adapter -> Option C
Quick Check:
Server output needs adapter, else build error [OK]
Hint: Server output requires adapter; missing it causes build error [OK]
Common Mistakes:
Assuming build succeeds without adapter
Thinking static files are generated instead
Believing site runs normally without adapter
5. You want to self-host an Astro site with dynamic server rendering and also serve some static assets efficiently. Which setup correctly achieves this using the Node.js adapter?
hard
A. Set output: 'server', use adapter: node(), and place static files in public/ folder
B. Set output: 'static', use adapter: node(), and serve static files from src/
C. Set output: 'server', use adapter: static(), and place static files in public/
D. Set output: 'static', use adapter: static(), and place static files in public/
Solution
Step 1: Choose output and adapter for dynamic server rendering
Dynamic server rendering requires output: 'server' and adapter: node().
Step 2: Serve static assets efficiently
Static files should be placed in the public/ folder to be served directly by the server.
Final Answer:
Set output 'server', adapter node(), and static files in public/ folder -> Option A