Cannot GET / Route Express Fix
If you are learning Node.js and Express.js, one of the most common errors you will see is:
Cannot GET /This error confuses many beginners because the server is running correctly, but the browser still shows an error page.
In this complete guide, you will learn:
- What “Cannot GET /” means
- Why the error happens
- How to fix it step-by-step
- Express routing basics
- Static file serving
- API route handling
- Apollo Server integration
- Common mistakes developers make
- Best practices for Express applications
This guide is beginner friendly and uses simple English with practical examples.

What Does “Cannot GET /” Mean in Express?
The error:
Cannot GET /means:
Your Express server is running, but Express cannot find a route handler for the URL you are requesting.
Usually, this happens when you open:
http://localhost:3000/Code language: JavaScript (javascript)but your Express application does not contain:
app.get("/")Code language: JavaScript (javascript)Why Does This Error Happen?
The “Cannot GET / route Express fix” issue usually happens because of one of these reasons:
- No root route defined
- Wrong route path
- Static files not configured
- Using APIs only
- Frontend and backend mismatch
- Router not connected properly
- Apollo Server configured without homepage route
Basic Express Server Example
Here is a simple Express server:
import express from "express";
const app = express();
app.listen(3000, () => {
console.log("Server running on port 3000");
});Code language: JavaScript (javascript)If you run this code and open:
http://localhost:3000Code language: JavaScript (javascript)you will see:
Cannot GET /Why?
Because there is no route defined.
Fix 1: Add Root Route
The simplest Cannot GET / route Express fix is adding a root route.
Correct Solution
import express from "express";
const app = express();
app.get("/", (req, res) => {
res.send("Welcome to Express App");
});
app.listen(3000, () => {
console.log("Server running on port 3000");
});Code language: JavaScript (javascript)Now when you open:
http://localhost:3000Code language: JavaScript (javascript)you will see:
Welcome to Express AppUnderstanding Express Routes
Express routes tell the server how to respond to requests.
GET Route
app.get("/", (req, res) => {
res.send("Home Page");
});Code language: PHP (php)API Route
app.get("/users", (req, res) => {
res.json([
{ name: "John" },
{ name: "David" }
]);
});Code language: PHP (php)Route Parameters
app.get("/users/:id", (req, res) => {
res.send(req.params.id);
});Code language: PHP (php)Fix 2: Check Route Path Carefully
Sometimes developers define:
app.get("/home")Code language: JavaScript (javascript)but open:
http://localhost:3000/Code language: JavaScript (javascript)This causes the Cannot GET / error because / and /home are different routes.
Correct URL
http://localhost:3000/homeCode language: JavaScript (javascript)Fix 3: Serve Static Files Properly
Many beginners use HTML files but forget to configure static middleware.
Wrong Setup
import express from "express";
const app = express();
app.listen(3000);Code language: JavaScript (javascript)Opening / gives:
Cannot GET /Correct Static File Setup
Folder Structure
project/
│
├── public/
│ └── index.html
│
└── server.jsCode language: PHP (php)Express Code
import express from "express";
import path from "path";
const app = express();
app.use(express.static("public"));
app.listen(3000, () => {
console.log("Server running");
});Code language: JavaScript (javascript)Now Express automatically serves:
public/index.htmlCode language: PHP (php)when users open:
http://localhost:3000Code language: JavaScript (javascript)Example index.html
<!DOCTYPE html>
<html>
<head>
<title>Express App</title>
</head>
<body>
<h1>Hello Express</h1>
</body>
</html>Code language: HTML, XML (xml)Fix 4: Using Express Router Correctly
Many Node.js developers use Express Router incorrectly.
Common Mistake
routes/user.js
import express from "express";
const router = express.Router();
router.get("/", (req, res) => {
res.send("Users Route");
});
export default router;Code language: JavaScript (javascript)But forget to connect router in main app.
Correct Setup
server.js
import express from "express";
import userRoutes from "./routes/user.js";
const app = express();
app.use("/users", userRoutes);
app.listen(3000);Code language: JavaScript (javascript)Now:
http://localhost:3000/usersCode language: JavaScript (javascript)works correctly.
Fix 5: Apollo Server and Express
This issue also happens frequently when using Apollo Server with Express.
Many developers configure GraphQL only and forget normal Express routes.
Apollo Server Example
import express from "express";
import { ApolloServer } from "@apollo/server";
import { expressMiddleware } from "@as-integrations/express5";
const app = express();
const server = new ApolloServer({
typeDefs,
resolvers,
});
await server.start();
app.use("/graphql", expressMiddleware(server));
app.listen(4000);Code language: JavaScript (javascript)If you open:
http://localhost:4000/Code language: JavaScript (javascript)you get:
Cannot GET /because only /graphql exists.
Apollo Server Fix
Add homepage route:
app.get("/", (req, res) => {
res.send("GraphQL Server Running");
});Code language: PHP (php)Now both work:
http://localhost:4000/Code language: JavaScript (javascript)and
http://localhost:4000/graphqlCode language: JavaScript (javascript)Fix 6: Frontend and Backend Port Confusion
This is very common in React, Next.js, and Express projects.
Example:
| Service | Port |
|---|---|
| React Frontend | 3000 |
| Express Backend | 5000 |
If backend has only API routes:
app.get("/api/users")Code language: JavaScript (javascript)then opening:
http://localhost:5000/Code language: JavaScript (javascript)shows:
Cannot GET /because backend is API-only.
This is normal behavior.
API-Only Backend Example
app.get("/api/users", (req, res) => {
res.json(users);
});Code language: PHP (php)Correct URL:
http://localhost:5000/api/usersCode language: JavaScript (javascript)Fix 7: Wildcard Route for SPA Applications
Single Page Applications (React, Angular, Vue) need fallback routes.
Without fallback routes, page refreshes may show:
Cannot GET /dashboardExpress SPA Fix
app.use(express.static("build"));
app.get("*", (req, res) => {
res.sendFile(path.resolve("build/index.html"));
});Code language: PHP (php)This sends React’s index.html for all routes.
Common Mistakes Developers Make
1. Forgetting Root Route
app.listen(3000);Code language: CSS (css)without:
app.get("/")Code language: JavaScript (javascript)2. Wrong Route Order
Wrong
app.get("/:id", handler);
app.get("/users", handler);Code language: JavaScript (javascript)/:id captures /users.
Correct
app.get("/users", handler);
app.get("/:id", handler);Code language: JavaScript (javascript)3. Not Exporting Router
Wrong
const router = express.Router();Code language: JavaScript (javascript)without:
export default router;Code language: JavaScript (javascript)4. Wrong URL Testing
Testing:
localhost:3000Code language: CSS (css)instead of:
localhost:3000/api/users5. Static Folder Misconfiguration
Wrong
app.use(express.static("assets"));Code language: CSS (css)when folder name is actually:
publicCode language: PHP (php)Best Practices for Express Routing
Always Create Health Route
app.get("/", (req, res) => {
res.send("API Running");
});Code language: PHP (php)This helps debugging.
Use Route Prefixes
Good structure:
/api/users
/api/products
/api/ordersOrganize Routes Properly
Recommended Structure
project/
│
├── routes/
├── controllers/
├── middleware/
├── public/
├── server.jsCode language: PHP (php)Use Express Router
Instead of writing all routes in one file.
Add Error Handling
app.use((req, res) => {
res.status(404).send("Route Not Found");
});Code language: JavaScript (javascript)Complete Express Example
import express from "express";
import path from "path";
const app = express();
app.use(express.json());
app.use(express.static("public"));
app.get("/", (req, res) => {
res.send("Welcome to Express");
});
app.get("/api/users", (req, res) => {
res.json([
{ id: 1, name: "John" },
{ id: 2, name: "David" }
]);
});
app.use((req, res) => {
res.status(404).send("Page Not Found");
});
app.listen(3000, () => {
console.log("Server running on port 3000");
});Code language: JavaScript (javascript)How to Debug “Cannot GET /” Error
Follow this checklist:
Step 1
Check server is running.
Step 2
Verify route exists.
Step 3
Check URL carefully.
Step 4
Verify middleware order.
Step 5
Check static folder configuration.
Step 6
Test API endpoints in Postman.
Useful tool:
FAQ
Why does Express show Cannot GET /?
Because no route handler exists for /.
Is Cannot GET / an error?
Technically yes, but usually it simply means the route does not exist.
How do I fix Cannot GET / in Express?
Add:
app.get("/", (req, res) => {
res.send("Hello World");
});Code language: PHP (php)Why does Apollo Server show Cannot GET /?
Because GraphQL route exists only at:
/graphqlnot /.
Conclusion
The “Cannot GET / route Express fix” problem is one of the most common issues in Node.js and Express.js applications.
Fortunately, the solution is usually simple:
- Add correct routes
- Configure static files
- Use routers properly
- Check URLs carefully
- Understand API-only backends
- Configure Apollo Server correctly
Once you understand Express routing, this issue becomes very easy to debug.
If you are building Node.js, Express, GraphQL, or Next.js applications, understanding route handling is an essential skill for backend development.