12 промтов для Node.js и Express: API, middleware, авторизация

Введение

Node.js и Express остаются одним из самых популярных стеков для построения серверных приложений. По данным опроса Stack Overflow 2025 года, Node.js используют более 42% профессиональных разработчиков, а Express — самый распространённый фреймворк в экосистеме. Однако написание эффективного, безопасного и поддерживаемого кода требует не только знания синтаксиса, но и умения правильно формулировать задачи для AI-ассистентов. Я собрал 12 промтов, которые покрывают ключевые аспекты разработки на Node.js и Express: от создания REST API до настройки middleware и систем авторизации. Каждый промт проверен на практике и включает примеры кода, готовые к интеграции в ваш проект.

Категория 1: Базовые промты для REST API

Промт 1: Генерация структуры Express-приложения

Задача: Быстро создать скелет Express-приложения с маршрутизацией и обработкой ошибок.

Промт:

Создай структуру Express-приложения на Node.js с поддержкой маршрутов для пользователей (GET, POST, PUT, DELETE). Используй ES6-синтаксис, модули, обработку ошибок через middleware. Включи пример конфигурации порта и CORS.

Пример результата:

import express from 'express';
import cors from 'cors';
import userRoutes from './routes/users.js';

const app = express();
const PORT = process.env.PORT || 3000;

app.use(cors());
app.use(express.json());

app.use('/api/users', userRoutes);

app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).json({ message: 'Something went wrong!' });
});

app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});

Промт 2: Создание CRUD-маршрутов с валидацией

Задача: Сгенерировать маршруты для работы с ресурсом с проверкой входных данных.

Промт:

Напиши Express-маршруты для CRUD операций с коллекцией 'tasks'. Каждый маршрут должен включать валидацию полей (title — строка от 3 до 100 символов, completed — булево). Используй express-validator. Верни код с комментариями.

Пример результата:

import { Router } from 'express';
import { body, validationResult } from 'express-validator';

const router = Router();

let tasks = [];

router.get('/', (req, res) => {
  res.json(tasks);
});

router.post(
  '/',
  [
    body('title').isString().isLength({ min: 3, max: 100 }),
    body('completed').isBoolean()
  ],
  (req, res) => {
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
      return res.status(400).json({ errors: errors.array() });
    }
    const task = { id: Date.now(), ...req.body };
    tasks.push(task);
    res.status(201).json(task);
  }
);

export default router;

Категория 2: Продвинутые промты для middleware

Промт 3: Кастомное middleware для логирования запросов

Задача: Написать middleware, которое логирует метод, URL и время выполнения каждого запроса.

Промт:

Создай middleware для Express, которое записывает в консоль метод запроса, URL и время обработки в миллисекундах. Используй process.hrtime для точности.

Пример результата:

const requestLogger = (req, res, next) => {
  const start = process.hrtime();
  res.on('finish', () => {
    const duration = process.hrtime(start);
    const ms = duration[0] * 1000 + duration[1] / 1e6;
    console.log(`${req.method} ${req.originalUrl} - ${ms.toFixed(2)}ms`);
  });
  next();
};

app.use(requestLogger);

Промт 4: Middleware для обработки ошибок с разными статусами

Задача: Реализовать централизованный обработчик ошибок с поддержкой пользовательских ошибок.

Промт:

Напиши класс AppError с полями message и statusCode, и middleware, которое перехватывает все ошибки и возвращает JSON с соответствующим HTTP-статусом. Включи поддержку 404, 400 и 500.

Пример результата:

class AppError extends Error {
  constructor(message, statusCode) {
    super(message);
    this.statusCode = statusCode;
  }
}

const errorHandler = (err, req, res, next) => {
  const statusCode = err.statusCode || 500;
  res.status(statusCode).json({
    status: 'error',
    message: err.message || 'Internal Server Error'
  });
};

app.use(errorHandler);

Категория 3: Экспертные промты для авторизации

Промт 5: JWT-аутентификация с refresh-токенами

Задача: Реализовать полную систему аутентификации с access и refresh токенами.

Промт:

Реализуй на Express аутентификацию с JWT: маршрут /login возвращает access-токен (15 минут) и refresh-токен (7 дней). Маршрут /refresh обновляет access-токен. Используй jsonwebtoken и bcrypt для хеширования паролей. Храни refresh-токены в памяти (массив).

Пример результата:

import jwt from 'jsonwebtoken';
import bcrypt from 'bcrypt';

const users = [{ id: 1, email: 'user@test.com', password: '$2b$10$...' }];
let refreshTokens = [];

const ACCESS_SECRET = 'access-secret';
const REFRESH_SECRET = 'refresh-secret';

router.post('/login', async (req, res) => {
  const { email, password } = req.body;
  const user = users.find(u => u.email === email);
  if (!user || !(await bcrypt.compare(password, user.password))) {
    return res.status(401).json({ message: 'Invalid credentials' });
  }
  const accessToken = jwt.sign({ id: user.id }, ACCESS_SECRET, { expiresIn: '15m' });
  const refreshToken = jwt.sign({ id: user.id }, REFRESH_SECRET, { expiresIn: '7d' });
  refreshTokens.push(refreshToken);
  res.json({ accessToken, refreshToken });
});

router.post('/refresh', (req, res) => {
  const { refreshToken } = req.body;
  if (!refreshToken || !refreshTokens.includes(refreshToken)) {
    return res.status(403).json({ message: 'Invalid refresh token' });
  }
  jwt.verify(refreshToken, REFRESH_SECRET, (err, user) => {
    if (err) return res.status(403).json({ message: 'Token expired' });
    const accessToken = jwt.sign({ id: user.id }, ACCESS_SECRET, { expiresIn: '15m' });
    res.json({ accessToken });
  });
});

Промт 6: Middleware для проверки ролей (RBAC)

Задача: Создать middleware, которое проверяет роль пользователя для доступа к маршруту.

Промт:

Напиши middleware authorize(roles) для Express, которое принимает массив допустимых ролей. Предположи, что req.user содержит объект с полем role. Если роль не подходит — верни 403.

Пример результата:

const authorize = (...roles) => {
  return (req, res, next) => {
    if (!req.user || !roles.includes(req.user.role)) {
      return res.status(403).json({ message: 'Forbidden' });
    }
    next();
  };
};

// Использование
app.delete('/api/users/:id', authenticate, authorize('admin'), deleteUser);

Промт 7: Интеграция с OAuth 2.0 (Google)

Задача: Реализовать вход через Google с помощью Passport.js.

Промт:

Настрой стратегию Google OAuth 2.0 с Passport.js для Express. Включи маршруты /auth/google и /auth/google/callback. После успешной аутентификации создавай JWT-токен. Используй переменные окружения для clientID и clientSecret.

Пример результата:

import passport from 'passport';
import { Strategy as GoogleStrategy } from 'passport-google-oauth20';

passport.use(
  new GoogleStrategy(
    {
      clientID: process.env.GOOGLE_CLIENT_ID,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET,
      callbackURL: '/auth/google/callback'
    },
    (accessToken, refreshToken, profile, done) => {
      // Найти или создать пользователя в БД
      done(null, profile);
    }
  )
);

router.get('/auth/google', passport.authenticate('google', { scope: ['profile', 'email'] }));
router.get('/auth/google/callback', passport.authenticate('google', { session: false }), (req, res) => {
  const token = jwt.sign({ id: req.user.id }, process.env.JWT_SECRET);
  res.json({ token });
});

Категория 4: Промты для WebSocket и реального времени

Промт 8: Чат на WebSocket с Express и Socket.IO

Задача: Создать простой чат-сервер с комнатами.

Промт:

Реализуй WebSocket-сервер с Socket.IO на базе Express. Поддержи комнаты: пользователь может войти в комнату, отправлять сообщения только в неё. На стороне сервера логируй события подключения и отключения.

Пример результата:

import { Server } from 'socket.io';

const io = new Server(httpServer);

io.on('connection', (socket) => {
  console.log(`User connected: ${socket.id}`);

  socket.on('join-room', (room) => {
    socket.join(room);
    console.log(`${socket.id} joined room ${room}`);
  });

  socket.on('chat-message', ({ room, message }) => {
    io.to(room).emit('chat-message', { user: socket.id, message });
  });

  socket.on('disconnect', () => {
    console.log(`User disconnected: ${socket.id}`);
  });
});

Промт 9: Аутентификация через WebSocket

Задача: Проверять JWT-токен при подключении к Socket.IO.

Промт:

Настрой middleware для Socket.IO, которое проверяет JWT-токен из query-параметра при подключении. Если токен невалидный — отклони соединение с ошибкой.

Пример результата:

import jwt from 'jsonwebtoken';

io.use((socket, next) => {
  const token = socket.handshake.query.token;
  if (!token) {
    return next(new Error('Authentication error'));
  }
  jwt.verify(token, process.env.JWT_SECRET, (err, decoded) => {
    if (err) return next(new Error('Invalid token'));
    socket.user = decoded;
    next();
  });
});

io.on('connection', (socket) => {
  console.log(`Authenticated user ${socket.user.id}`);
});

Категория 5: Промты для оптимизации и безопасности

Промт 10: Ограничение частоты запросов (rate limiting)

Задача: Защитить API от DDoS-атак с помощью express-rate-limit.

Промт:

Установи rate limiting для всех маршрутов /api/ с лимитом 100 запросов в минуту. Для маршрута /api/auth/login — 10 запросов в минуту. Используй express-rate-limit.

Пример результата:

import rateLimit from 'express-rate-limit';

const globalLimiter = rateLimit({
  windowMs: 60 * 1000,
  max: 100,
  message: 'Too many requests, please try again later.'
});

const authLimiter = rateLimit({
  windowMs: 60 * 1000,
  max: 10,
  message: 'Too many login attempts.'
});

app.use('/api/', globalLimiter);
app.use('/api/auth/login', authLimiter);

Промт 11: Защита от CSRF и XSS

Задача: Добавить заголовки безопасности с helmet и CSRF-защиту.

Промт:

Настрой helmet для Express (включи CSP, X-Frame-Options, X-Content-Type-Options) и csurf для защиты от CSRF. Верни код с пояснениями.

Пример результата:

import helmet from 'helmet';
import csrf from 'csurf';

app.use(helmet());
app.use(csrf({ cookie: true }));

// Маршрут для получения CSRF-токена
app.get('/api/csrf-token', (req, res) => {
  res.json({ csrfToken: req.csrfToken() });
});

Заключение

Представленные промты охватывают ключевые аспекты разработки на Node.js и Express: от базовой структуры приложения до продвинутых механизмов авторизации и безопасности. Эти шаблоны помогут вам быстрее создавать надёжные API, middleware и системы реального времени. Не забывайте адаптировать код под конкретные требования вашего проекта — тестируйте, расширяйте и делитесь своими улучшениями. Экспериментируйте, комбинируйте промты и стройте современные серверные приложения с уверенностью.

← Все статьи

Комментарии

Читайте также

Экономика рекурсивного самоулучшения: Почему Vibe Coding меняет правила игры

14 июля 2026

Нефтегазовое дело и энергетика: как освоить всю цепочку отрасли с AI-тьютором

14 июля 2026

MorphoHDL: Минималистичный язык для выращивания схем — революция в проектировании электроники с помощью vibe coding

14 июля 2026

10 промтов для Rust: системное программирование, CLI и WebAssembly — шпаргалка для разработчика

14 июля 2026

Production ML (MLOps) курс: как запускать модели в продакшн и не бояться дрейфа данных

14 июля 2026

Blockchain Security & Smart Contract Auditor: Почему эта профессия — золотая жила 2026 года и как её освоить на asibiont.com

14 июля 2026

Команда Git history: недооценённый инструмент, который стоит изучить каждому разработчику

14 июля 2026

Claude становится строже на русском: Anthropic выяснила, как язык меняет ответы ИИ

14 июля 2026

Освоение Водного и Лесного кодексов России: Курс для карьерного роста с обучением на основе ИИ

14 июля 2026