Putting it together
- Node.js course
- Intermediate
- Lesson 116/116
- 6 min
Combine all layers into a working API.
Request simulation
We can simulate a request's flow without actually starting the server. We define a fake req object (method, url) and a fake res object (json), then pass them to the middleware. This shows the output of the middleware → route chain deterministically.
Example: const req = {method: 'GET', url: '/users'} and const res = {json: (d) => console.log('Response: ' + JSON.stringify(d))}. Then call middleware[0](req, res, () => { console.log('Handled: ' + req.method + ' ' + req.url); }). The middleware first logs 'Request: GET', calls next() to run the callback, and the callback logs 'Handled: GET /users'. This is a deterministic, fast way to verify the request flow without starting the server.
All pieces come together
In the final lesson Express routes, fs persistence and middleware combine. When a request arrives the middleware runs first (logs the method), then the route handler returns the data. The data is saved to a file and restored; the user list persists even if the server restarts.
This project tests Express + fs + middleware accumulation: route registration (app.get/app.post), persistence (saveUsers/loadUsers) and middleware (app.use). Each lesson's starting code contains the previous solution; the final lesson's code combines all pieces. The output is a deterministic trace of the request flow: 'Server ready', 'Routes: ...', 'Loaded: ...', 'Middleware: 1', 'Request: GET', 'Handled: GET /users'.
Practice Run the request simulation
Define const req = {method: 'GET', url: '/users'}. Define const res = {json: (d) => console.log('Response: ' + JSON.stringify(d))}. Call middleware[0](req, res, () => { console.log('Handled: ' + req.method + ' ' + req.url); }).
Starter code
const express = require('express');
const app = express();
const routes = [];
app.get('/health', (req, res) => res.json({ok: true}));
routes.push({method: 'GET', path: '/health'});
console.log('Server ready');
app.get('/users', (req, res) => res.json([]));
routes.push({method: 'GET', path: '/users'});
app.post('/users', (req, res) => res.json({created: true}));
routes.push({method: 'POST', path: '/users'});
console.log('Routes: ' + routes.map(r => r.method + ' ' + r.path).join(', '));
const fs = require('fs');
const DB_PATH = '/tmp/nodejs-i20.json';
function saveUsers(data) {
fs.writeFileSync(DB_PATH, JSON.stringify(data));
}
function loadUsers() {
return JSON.parse(fs.readFileSync(DB_PATH, 'utf8'));
}
saveUsers({users: ['Ayşe', 'Alex']});
console.log('Loaded: ' + JSON.stringify(loadUsers()));
const middleware = [];
middleware.push((req, res, next) => { console.log('Request: ' + req.method); next(); });
app.use(middleware[0]);
console.log('Middleware: ' + middleware.length);
// Define a simulated req object (method, url)
// Define a simulated res object (json)
// Call middleware[0], print handled in next
// write hereSample solution
const express = require('express');
const app = express();
const routes = [];
app.get('/health', (req, res) => res.json({ok: true}));
routes.push({method: 'GET', path: '/health'});
console.log('Server ready');
app.get('/users', (req, res) => res.json([]));
routes.push({method: 'GET', path: '/users'});
app.post('/users', (req, res) => res.json({created: true}));
routes.push({method: 'POST', path: '/users'});
console.log('Routes: ' + routes.map(r => r.method + ' ' + r.path).join(', '));
const fs = require('fs');
const DB_PATH = '/tmp/nodejs-i20.json';
function saveUsers(data) {
fs.writeFileSync(DB_PATH, JSON.stringify(data));
}
function loadUsers() {
return JSON.parse(fs.readFileSync(DB_PATH, 'utf8'));
}
saveUsers({users: ['Ayşe', 'Alex']});
console.log('Loaded: ' + JSON.stringify(loadUsers()));
const middleware = [];
middleware.push((req, res, next) => { console.log('Request: ' + req.method); next(); });
app.use(middleware[0]);
console.log('Middleware: ' + middleware.length);
const req = {method: 'GET', url: '/users'};
const res = {json: (d) => console.log('Response: ' + JSON.stringify(d))};
middleware[0](req, res, () => {
console.log('Handled: ' + req.method + ' ' + req.url);
});Expected output
Sunucu hazır
Rotalar: GET /health, GET /users, POST /users
Yüklendi: {"users":["Ayşe","Alex"]}
Ara katman: 1
İstek: GET
İşlendi: GET /users
Questions and answers
Review the lesson questions together with their answers. To test yourself, solve the lesson interactively.
1 Complete the next() call
console.log('İstek: ' + req.method); ____();
console.log('İstek: ' + req.method); next();
Explanation: next() passes to the next middleware or route.
2 When does cb run in middleware[0](req, res, cb)?
middleware[0](req, res, () => { console.log('İşlendi'); })- Before the middleware
- When next() is called inside the middleware Correct answer
- Never
- When the server closes
Explanation: cb runs when next() is called inside the middleware.
3 Match each piece to its role
| Term | Meaning |
|---|---|
app.get |
Registers a route |
saveUsers |
Writes data to a file |
app.use |
Registers middleware |
middleware[0] |
Calls the first middleware |