← Back to Node.js Menu | 🏠 Hub
# Install
npm init -y
npm install express
# server.js
const express = require('express');
const app = express();
app.use(express.json()); // parse JSON body
app.use(express.urlencoded({ extended: true })); // parse form data
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server running at http://localhost:${PORT}`);
});
// Basic routes
app.get('/', (req, res) => {
res.send('Hello World!'); // text response
});
app.get('/json', (req, res) => {
res.json({ message: 'OK', time: new Date() }); // JSON response
});
app.get('/status', (req, res) => {
res.status(200).json({ status: 'healthy' });
});
// Route parameters (dynamic segments)
app.get('/users/:id', (req, res) => {
const { id } = req.params;
res.json({ userId: id });
});
// Multiple params
app.get('/posts/:postId/comments/:commentId', (req, res) => {
const { postId, commentId } = req.params;
res.json({ postId, commentId });
});
// Query string: /search?q=hello&page=2
app.get('/search', (req, res) => {
const { q, page = 1, limit = 10 } = req.query;
res.json({ query: q, page: Number(page), limit: Number(limit) });
});
// POST with body
app.post('/users', (req, res) => {
const { name, email } = req.body;
// validate & save...
res.status(201).json({ id: Date.now(), name, email });
});
// PUT / PATCH / DELETE
app.put('/users/:id', (req, res) => { /* update */ });
app.patch('/users/:id', (req, res) => { /* partial update */ });
app.delete('/users/:id', (req, res) => { res.status(204).end(); });
// Middleware = function that runs BETWEEN request and response
// (req, res, next) — next() calls the NEXT middleware
// Global middleware (applies to all routes)
app.use((req, res, next) => {
console.log(`${req.method} ${req.url} — ${new Date().toISOString()}`);
next(); // continue to next middleware/route
});
// CORS middleware
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
next();
});
// Route-specific middleware
function authMiddleware(req, res, next) {
const token = req.headers.authorization?.split(' ')[1];
if (!token) return res.status(401).json({ error: 'No token' });
// verify token...
req.user = { id: 1, name: 'Ko' }; // attach to request
next();
}
app.get('/profile', authMiddleware, (req, res) => {
res.json(req.user);
});
// Error handling middleware (4 params — special!)
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).json({ error: err.message });
});
// 404 handler (put LAST)
app.use((req, res) => {
res.status(404).json({ error: 'Route not found' });
});
// Serve static files (HTML, CSS, images)
app.use(express.static('public'));
// Files in /public folder → accessible directly
// /public/index.html → http://localhost:3000/
// /public/css/style.css → http://localhost:3000/css/style.css
// Express Router — organize routes
// routes/users.js
const router = require('express').Router();
router.get('/', (req, res) => res.json([/* users */]));
router.get('/:id', (req, res) => res.json({ id: req.params.id }));
router.post('/', (req, res) => res.status(201).json(req.body));
router.put('/:id', (req, res) => res.json({ updated: req.params.id }));
router.delete('/:id',(req, res) => res.status(204).end());
module.exports = router;
// server.js
const userRoutes = require('./routes/users');
app.use('/api/users', userRoutes);
// /api/users → GET all
// /api/users/1 → GET by id
← Node.js 03 | Next: Node.js 05 → REST API →