← Назад к вопросам

Какое количество API разработал на Express?

1.0 Junior🔥 163 комментариев
#Soft skills и опыт работы#Фреймворки и библиотеки

Комментарии (3)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Express API: опыт разработки

Express — это мой основной инструмент для backend разработки. За 10+ лет я разработал десятки production API, от простых REST сервисов до сложных микросервисных архитектур.

Масштаб моего опыта

Количество API проектов: 30+ сервисов

Типы API:

  • REST API (20+ проектов) — классическая архитектура
  • GraphQL API (5 проектов) — для клиентов с гибким запросом данных
  • Real-time API (4 проекта) — WebSocket с Socket.io
  • Микросервисная архитектура (8 проектов) — 50+ endpoint'ов в каждом
  • Admin API (12 проектов) — управление данными

Примеры архитектур, которые я разрабатывал

1. E-commerce платформа (REST API)

// Масштаб: 150+ endpoints
const app = require('express')();

app.use('/api/v1/auth', require('./routes/auth'));
app.use('/api/v1/products', require('./routes/products'));
app.use('/api/v1/orders', require('./routes/orders'));
app.use('/api/v1/users', require('./routes/users'));
app.use('/api/v1/payments', require('./routes/payments'));
app.use('/api/v1/reviews', require('./routes/reviews'));
app.use('/api/v1/admin', require('./routes/admin'));

// Нагрузка: 100,000 RPS, 99.9% uptime
// Stack: Express + PostgreSQL + Redis + RabbitMQ

Ключевые features:

  • JWT аутентификация
  • Role-based access control (RBAC)
  • Rate limiting
  • Кэширование через Redis
  • Асинхронная обработка заказов
  • Логирование всех операций

2. SaaS платформа (Multi-tenant)

// 80+ endpoints с изоляцией данных по tenant
const app = require('express')();
const { TenantMiddleware } = require('./middleware/tenant');

app.use(TenantMiddleware);

app.use('/api/v1/dashboard', require('./routes/dashboard'));
app.use('/api/v1/analytics', require('./routes/analytics'));
app.use('/api/v1/settings', require('./routes/settings'));
app.use('/api/v1/users', require('./routes/users'));

// Особенность: каждый tenant видит только свои данные
// Реализация: WHERE tenant_id = req.tenant.id

3. Real-time уведомления (WebSocket API)

const express = require('express');
const http = require('http');
const socketIo = require('socket.io');

const app = express();
const server = http.createServer(app);
const io = socketIo(server, {
  cors: { origin: '*' }
});

app.use('/api/v1', require('./routes/api'));

io.on('connection', (socket) => {
  console.log(`User ${socket.id} connected`);
  
  // Подписка на события
  socket.on('subscribe-notifications', (userId) => {
    socket.join(`user:${userId}`);
  });
  
  socket.on('disconnect', () => {
    console.log(`User ${socket.id} disconnected`);
  });
});

// Отправка уведомлений
app.post('/api/v1/notify', (req, res) => {
  const { userId, message } = req.body;
  io.to(`user:${userId}`).emit('notification', message);
  res.json({ sent: true });
});

server.listen(3000);

4. Микросервисная архитектура (API Gateway)

// API Gateway маршрутизирует запросы
const express = require('express');
const httpProxy = require('express-http-proxy');
const { TokenAuth } = require('./middleware/auth');

const app = express();
app.use(TokenAuth);

// Auth Service
app.use('/api/v1/auth', httpProxy('http://auth-service:3001'));

// User Service
app.use('/api/v1/users', httpProxy('http://user-service:3002'));

// Order Service
app.use('/api/v1/orders', httpProxy('http://order-service:3003'));

// Payment Service
app.use('/api/v1/payments', httpProxy('http://payment-service:3004'));

// Notification Service
app.use('/api/v1/notifications', httpProxy('http://notification-service:3005'));

app.listen(3000);

Технологический стек, который я использую

Framework и Middleware:

const express = require('express');
const helmet = require('helmet');           // Security headers
const cors = require('cors');               // CORS
const morgan = require('morgan');           // Logging
const rateLimit = require('express-rate-limit'); // Rate limiting
const compression = require('compression'); // Gzip
const validator = require('joi');           // Validation

const app = express();

app.use(helmet());
app.use(cors({ origin: process.env.FRONTEND_URL }));
app.use(morgan('combined'));
app.use(compression());
app.use(express.json({ limit: '10mb' }));

const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 минут
  max: 100 // 100 запросов за окно
});
app.use('/api/', limiter);

Database и ORM:

  • PostgreSQL (основная БД)
  • TypeORM или Sequelize (ORM)
  • Redis (кэш и сессии)
  • Elasticsearch (поиск и логирование)

Message Queue:

  • RabbitMQ (асинхронные задачи)
  • Kafka (high-volume потоки)

Архитектурные паттерны

1. Service Layer Pattern

// routes/users.js
const express = require('express');
const UserService = require('../services/UserService');
const { validateUser } = require('../validators');

const router = express.Router();
const userService = new UserService();

router.post('/', async (req, res) => {
  const { error, value } = validateUser(req.body);
  if (error) return res.status(400).json({ error });
  
  try {
    const user = await userService.create(value);
    res.status(201).json(user);
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
});

module.exports = router;

2. Middleware для Cross-cutting Concerns

// middleware/errorHandler.js
function errorHandler(err, req, res, next) {
  const status = err.status || 500;
  const message = err.message || 'Internal Server Error';
  
  logger.error('Error:', { status, message, path: req.path });
  
  res.status(status).json({ 
    error: message,
    ...(process.env.NODE_ENV === 'development' && { stack: err.stack })
  });
}

app.use(errorHandler);

3. Request/Response Validation

const { body, param, validationResult } = require('express-validator');

router.post('/:id/like', [
  param('id').isUUID(),
  body('reaction').isIn(['like', 'love', 'haha'])
], (req, res) => {
  const errors = validationResult(req);
  if (!errors.isEmpty()) {
    return res.status(400).json({ errors: errors.array() });
  }
  // Обработка
});

Performance Optimizations

1. Кэширование

const redis = require('redis');
const client = redis.createClient();

app.get('/api/v1/posts/:id', async (req, res) => {
  const cacheKey = `post:${req.params.id}`;
  const cached = await client.get(cacheKey);
  
  if (cached) {
    return res.json(JSON.parse(cached));
  }
  
  const post = await db.posts.findById(req.params.id);
  await client.setex(cacheKey, 3600, JSON.stringify(post));
  res.json(post);
});

2. Pagination

app.get('/api/v1/posts', async (req, res) => {
  const page = Math.max(1, parseInt(req.query.page) || 1);
  const limit = Math.min(100, parseInt(req.query.limit) || 20);
  const offset = (page - 1) * limit;
  
  const [posts, total] = await Promise.all([
    db.posts.findAll({ offset, limit, order: [['createdAt', 'DESC']] }),
    db.posts.count()
  ]);
  
  res.json({
    posts,
    pagination: {
      page,
      limit,
      total,
      pages: Math.ceil(total / limit)
    }
  });
});

3. Async Processing

app.post('/api/v1/reports', async (req, res) => {
  // Мгновенный ответ
  res.status(202).json({ id: uuid(), status: 'processing' });
  
  // Обработка в background
  queue.add('generate-report', req.body, {
    delay: 0,
    attempts: 3
  });
});

Monitoring и Logging

const winston = require('winston');

const logger = winston.createLogger({
  level: process.env.LOG_LEVEL || 'info',
  format: winston.format.json(),
  transports: [
    new winston.transports.File({ filename: 'error.log', level: 'error' }),
    new winston.transports.File({ filename: 'combined.log' })
  ]
});

app.use((req, res, next) => {
  const start = Date.now();
  res.on('finish', () => {
    const duration = Date.now() - start;
    logger.info('Request', {
      method: req.method,
      path: req.path,
      status: res.statusCode,
      duration
    });
  });
  next();
});

Тестирование API

// test/api.test.js
const request = require('supertest');
const app = require('../app');

describe('POST /api/v1/users', () => {
  it('creates a new user', async () => {
    const res = await request(app)
      .post('/api/v1/users')
      .send({
        name: 'John Doe',
        email: 'john@example.com'
      })
      .expect(201);
    
    expect(res.body).toHaveProperty('id');
    expect(res.body.name).toBe('John Doe');
  });
});

Итого

За мою карьеру я разработал:

  • 30+ production API сервисов
  • 500+ endpoints
  • Обработал миллиарды запросов
  • Достиг 99.95% uptime в production
  • Работал с нагрузкой от 10K до 500K RPS

Ключевые навыки:

  • Проектирование REST и GraphQL API
  • Масштабирование и optimization
  • Security и authentication
  • Мониторинг и логирование
  • DevOps и deployment
  • Микросервисная архитектура

Express остаётся моим инструментом выбора для большинства backend проектов благодаря его гибкости, производительности и огромной экосистеме.

Какое количество API разработал на Express? | PrepBro