Welcome! This guide will help you master Node.js API development at an intermediate level. We’ll cover core concepts, common interview questions, ideal answers, real-world examples, and study tips. Let’s dive in.
**What is Express.js?.js is a minimal and flexible Node.js framework for building web applications and APIs. It provides robust features like routing, middleware, and templating.
Key Components:
GET /users, POST /login).app.use((err, req, res, next) => {...}).Example: Basic API Setup
const express = require('express'); const app = express(); // Middleware to parse JSON bodies app.use(express.json()); // Route example app.get('/api/users', (req, res) => { res.json({ message: 'List of users' }); }); // Start server app.listen(3000, () => console.log('Server running on port 3000'));
REST Principles:
GET, POST, PUT, DELETE).Best Practices:
/api/users/:user_id).200 OK, 404 Not Found, 401 Unauthorized).JWT (JSON Web Tokens):
Authorization header for subsequent requests.Example: JWT Middleware
const jwt = require('jsonwebtoken'); const authenticate = (req, res, next) => { const token = req.headers.authorization?.split(' ')[1]; if (!token) return res.status(401).json({ error: 'Access denied' }); try { const decoded = jwt.verify(token, process.env.JWT_SECRET); req.user = decoded; next(); } catch (err) { res.status(400).json({ error: 'Invalid token' }); } }; // Protected route app.get('/api/protected', authenticate, (req, res) => { res.json({ message: 'Protected data', user: req.user }); });
SQL vs NoSQL:
ORM/ODM Tools:
Example: Mongoose Model
const mongoose = require('mongoose'); const userSchema = new mongoose.Schema({ username: { type: String, required: true, unique: true }, email: { type: String, required: true }, password: String }); module.exports = mongoose.model('User', userSchema);
Centralized Error Handling:
app.use((err, req, res, next) => { console.error(err.stack); res.status(500).json({ error: 'Something went wrong!' }); });
Validation with express-validator:
const { body, validationResult } = require('express-validator'); app.post('/api/users', body('email').isEmail().normalizeEmail(), body('password').isLength({ min: 6 }), (req, res) => { const errors = validationResult(req); if (!errors.isEmpty()) { return res.status(400).json({ errors: errors.array() }); } //Proceed to create user } );
Ideal Answer:
Middleware functions have access to the request/response cycle. They’re used for tasks like:
express.json()).authenticate()).morgan).Ideal Answer:
Use async/await with try/catch for better readability and error handling:
app.get('/api/data', async (req, res, next) => { try { const data = await fetchDataFromDB(); res.json(data); } catch (err) { next(err); // Pass to error-handling middleware } });
Ideal Answer:
/graphql).Ideal Answer:
Use express-rate-limit package:
const rateLimit = require('express-rate-limit'); const limiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15 minutes max: 100, // Limit each IP to 100 requests per window message: 'Too many requests, please try again later' }); app.use('/api/login', limiter);
Create an API to register users, login, and fetch user profiles with JWT authentication.
Setup:
npm, install express, mongoose, jsonwebtoken, bcrypt, dotenv, express-validator.Models:
User.js (Mongoose model with hashed passwords).Routes:
POST /api/auth/register (validate input, hash password, save user).POST /api/auth/login (check credentials, return JWT).GET /api/profile (protected route, returns user data).Middleware:
authenticate.js (JWT verification).Error Handling:
Build Projects:
Master Testing:
Learn Security:
Understand Performance:
Review System Design:
Ask any clarifying questions or request deeper dives into specific areas!
Start a new session to explore different topics or increase the difficulty level.
Start New Session