Full-Stack Project Development

Build a complete full-stack application from scratch including frontend, backend, database, authentication, and deployment.

advanced Backend Development 10 hours

Chapter 3: Backend API Development

Chapter 3 of 15

Chapter 3: Backend API Development

3.1 RESTful API Design

RESTful APIs follow conventions that make them predictable and easy to use.

REST Principles:

  • Use HTTP methods correctly (GET, POST, PUT, DELETE, PATCH)
  • Use resource-based URLs
  • Return appropriate HTTP status codes
  • Use JSON for data exchange
  • Version your API
// RESTful routes
GET    /api/v1/users          // List all users
GET    /api/v1/users/:id      // Get specific user
POST   /api/v1/users           // Create user
PUT    /api/v1/users/:id      // Update entire user
PATCH  /api/v1/users/:id      // Partial update
DELETE /api/v1/users/:id      // Delete user

// Express implementation
const express = require('express');
const router = express.Router();

router.get('/users', getUsers);
router.get('/users/:id', getUser);
router.post('/users', createUser);
router.put('/users/:id', updateUser);
router.patch('/users/:id', patchUser);
router.delete('/users/:id', deleteUser);

3.2 API Response Format

// Consistent response format
function sendSuccess(res, data, statusCode = 200) {
    res.status(statusCode).json({
        success: true,
        data: data
    });
}

function sendError(res, message, statusCode = 400) {
    res.status(statusCode).json({
        success: false,
        error: {
            message: message,
            code: statusCode
        }
    });
}

// Usage
app.get('/users/:id', async (req, res) => {
    try {
        const user = await User.findById(req.params.id);
        if (!user) {
            return sendError(res, 'User not found', 404);
        }
        sendSuccess(res, user);
    } catch (error) {
        sendError(res, error.message, 500);
    }
});

3.3 API Documentation

// Using Swagger/OpenAPI
const swaggerJsdoc = require('swagger-jsdoc');
const swaggerUi = require('swagger-ui-express');

const swaggerOptions = {
    definition: {
        openapi: '3.0.0',
        info: {
            title: 'My API',
            version: '1.0.0'
        }
    },
    apis: ['./routes/*.js']
};

const swaggerSpec = swaggerJsdoc(swaggerOptions);
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec));