Введение
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 и системы реального времени. Не забывайте адаптировать код под конкретные требования вашего проекта — тестируйте, расширяйте и делитесь своими улучшениями. Экспериментируйте, комбинируйте промты и стройте современные серверные приложения с уверенностью.
Комментарии