Essential Express.js Interview Questions: Top 20 with Examples and In-Depth Explanations
1. What is Express.js, and why is it used?
Answer:
Express.js is a lightweight, fast, and flexible web application framework for Node.js. It provides a robust set of features to build single-page, multi-page, and hybrid web applications and APIs. It's widely used due to its minimalistic design and ease of use.
Example:
const express = require('express'); const app = express(); app.get('/', (req, res) => { res.send('Hello, Express!'); }); app.listen(3000, () => { console.log('Server is running on port 3000'); });
2. What is middleware in Express.js?
Answer:
Middleware in Express.js functions between the request and response cycle. They can modify requests and responses or terminate the request-response cycle.
Example:
app.use((req, res, next) => { console.log('Middleware executed'); next(); // Passes control to the next middleware/route handler });
3. How do you handle different HTTP methods in Express.js?
Answer:
Express allows handling HTTP methods like GET, POST, PUT, DELETE, etc., using corresponding functions like app.get(), app.post(), etc.
Example:
app.get('/get', (req, res) => res.send('GET request')); app.post('/post', (req, res) => res.send('POST request')); app.put('/put', (req, res) => res.send('PUT request')); app.delete('/delete', (req, res) => res.send('DELETE request'));
4. What is app.use() in Express.js?
Answer:
app.use() is a method to mount middleware at a specific path or globally for all routes. It's used for middleware functions that modify or handle requests and responses.
Example:
app.use(express.json()); // This parses incoming JSON requests and puts the parsed data in req.body
5. What is routing in Express.js?
Answer:
Routing refers to how an application responds to client requests for a particular endpoint (path and method). It’s the core of any web framework like Express.js.
Example:
app.get('/user', (req, res) => { res.send('User route'); }); app.post('/user', (req, res) => { res.send('User POST route'); });
6. How do you serve static files in Express.js?
Answer:
Express can serve static files (like images, CSS, and JavaScript) using the built-in middleware express.static().
Example:
app.use(express.static('public')); // Access static files in the 'public' directory (e.g., localhost:3000/image.jpg)
7. How do you handle query parameters in Express.js?
Answer:
Query parameters are part of the URL, and you can access them via req.query.
Example:
app.get('/search', (req, res) => { const query = req.query.q; res.send(`Search query: ${query}`); }); // Example: localhost:3000/search?q=express
8. How do you handle URL parameters in Express.js?
Answer:
URL parameters are dynamic parts of the URL. They can be accessed via req.params.
Example:
app.get('/user/:id', (req, res) => { const userId = req.params.id; res.send(`User ID: ${userId}`); }); // Example: localhost:3000/user/123
9. How do you handle form data in Express.js?
Answer:
To handle form data (usually submitted via POST), you need to use middleware to parse application/x-www-form-urlencoded data.
Example:
app.use(express.urlencoded({ extended: true })); app.post('/submit', (req, res) => { const { name, email } = req.body; res.send(`Name: ${name}, Email: ${email}`); });
10. How do you redirect requests in Express.js?
Answer:
You can redirect the user to another route using res.redirect().
Example:
app.get('/old-route', (req, res) => { res.redirect('/new-route'); });
11. What is the difference between res.send() and res.json() in Express.js?
Answer:
- res.send() can send a response in various formats (HTML, JSON, text).
- res.json() is used to send a JSON response explicitly.
Example:
app.get('/send', (req, res) => { res.send('This is a text response'); }); app.get('/json', (req, res) => { res.json({ message: 'This is a JSON response' }); });
12. How do you create and use a custom middleware in Express.js?
Answer:
You can create custom middleware by defining a function that takes req, res, and next as parameters.
Example:
const logMiddleware = (req, res, next) => { console.log(`Request to: ${req.url}`); next(); // Pass control to the next middleware }; app.use(logMiddleware);
13. How do you handle errors in Express.js?
Answer:
You can create error-handling middleware by adding a middleware function with four arguments: err, req, res, and next.
Example:
app.use((err, req, res, next) => { console.error(err.stack); res.status(500).send('Something went wrong!'); });
14. What are templates in Express.js, and how do you render them?
Answer:
Templates allow you to dynamically generate HTML. Express.js supports template engines like Pug, EJS, and Handlebars.
Example (Pug template):
- Set the view engine:
app.set('view engine', 'pug');
- Render the template:
app.get('/template', (req, res) => { res.render('index', { title: 'Express', message: 'Hello, Express!' }); });
15. How do you structure an Express.js application for scalability?
Answer:
You can organize routes, middleware, and controllers in separate folders:
- routes/: Contains route definitions.
- controllers/: Handles business logic.
- models/: Defines database schemas.
Example:
- app.js - routes/ - users.js - controllers/ - userController.js - models/ - userModel.js
16. What is next() in Express.js? Why is it important?
Answer:
next() is a function that passes control to the next middleware in the stack. It’s crucial to avoid blocking the request-response cycle.
Example:
app.use((req, res, next) => { console.log('Middleware 1'); next(); // Passes control to the next middleware }); app.use((req, res) => { console.log('Middleware 2'); res.send('Request complete'); });
17. How do you implement authentication in Express.js?
Answer:
Authentication can be implemented using libraries like passport.js or JWT (JSON Web Tokens).
Example (JWT-based authentication):
- Install jsonwebtoken:
npm install jsonwebtoken
- Create a token:
const jwt = require('jsonwebtoken'); const token = jwt.sign({ userId: user._id }, 'secretKey', { expiresIn: '1h' });
- Verify the token:
const verifyToken = (req, res, next) => { const token = req.headers['authorization']; if (!token) return res.status(403).send('Token is required'); jwt.verify(token, 'secretKey', (err, decoded) => { if (err) return res.status(401).send('Invalid Token'); req.user = decoded; next(); }); };
18. What is CORS in Express.js, and how do you enable it?
Answer:
CORS (Cross-Origin Resource Sharing) allows servers to control which origins can access the resources. It’s often required for APIs that are accessed from different domains.
Example:
const cors = require('cors'); app.use(cors()); // Enables CORS for all routes
19. How do you handle file uploads in Express.js?
Answer:
You can handle file uploads using the multer library.
Example:
- Install multer:
npm install multer
- Setup multer for file upload:
const multer = require('multer'); const upload = multer({ dest: 'uploads/' }); app.post('/upload', upload.single('file'), (req, res) => { res.send('File uploaded'); });
20. How do you handle sessions in Express.js?
Answer:
Sessions allow storing user-specific data across requests. You can manage sessions using express-session.
Example:
- Install express-session:
npm install express-session
- Use session middleware:
const session = require('express-session'); app.use(session({ secret: 'secret', resave: false, saveUninitialized: true })); app.get('/', (req, res) => { if (!req.session.views) { req.session.views = 1; } else { req.session.views++; } res.send(`Views: ${req.session.views}`); });
These questions cover a wide range of Express.js features and are commonly asked in interviews to evaluate your understanding and hands-on skills.