12 промтов для Node.js и Express: REST API, middleware и авторизация
Разработка на Node.js и Express сегодня немыслима без помощи AI-ассистентов. Но чтобы ChatGPT или GitHub Copilot выдали действительно рабочий код, нужно уметь формулировать промты — инструкции на естественном языке. Ошибка в промте — и вы получаете устаревший код, конфликтующие библиотеки или дыру в безопасности. В этой подборке — 12 проверенных промтов, которые я использую в своей ежедневной работе. Они покрывают создание REST API, middleware, аутентификацию и авторизацию, а также WebSocket-функциональность. Скопируйте нужный промт, адаптируйте под свой проект — и вы сэкономите часы времени.
Как правильно писать промты для Node.js
Прежде чем перейти к промтам, договоримся о структуре. Эффективный промт должен содержать:
- Контекст: какое приложение вы создаете, какие библиотеки уже используете.
- Требования: конкретные endpoints, параметры, формат ответа.
- Ограничения: например, версию Node.js (18+, 20+), способ хранения данных, предпочтения по стилю кода.
- Пример ожидаемого результата: описание или фрагмент кода.
Чем точнее промт, тем качественнее ответ. А теперь — к делу. Ниже таблица библиотек, которые упоминаются в подборке:
| Библиотека | Назначение | Документация |
|---|---|---|
| Express | Фреймворк для веб-приложений | expressjs.com |
| Joi | Валидация данных | github.com/hapijs/joi |
| jsonwebtoken | JWT-аутентификация | github.com/auth0/node-jsonwebtoken |
| Socket.io | WebSocket-сервер | socket.io |
| Morgan | Логирование запросов | github.com/expressjs/morgan |
| CORS | Middleware для доступа между доменами | github.com/expressjs/cors |
| Swagger | Документация API | swagger.io |
| Jest + Supertest | Тестирование | jestjs.io, github.com/ladjs/supertest |
Далее идут сами промты. Для каждого я указал, какую задачу он решает, привел готовый текст и пример ответа.
Промты для REST API
Промт №1: Генерация каркаса Express-приложения с CRUD
Назначение: получить базу для REST API с методами создания, получения, обновления и удаления сущности.
Промт:
«Сгенерируй Express-приложение для управления пользователями. Мне нужен REST API с endpoints: GET /users, GET /users/:id, POST /users, PUT /users/:id, DELETE /users/:id. Используй in-memory хранилище (массив объектов). Раздели код на routes и controllers. Подключи express.json() для парсинга тела запроса. Выведи полный код всех файлов.»
Как использовать: укажите свою сущность (например, «книги», «заказы»), добавьте параметры пагинации, если нужно.
Пример ответа:
// app.js
const express = require('express');
const userRoutes = require('./routes/userRoutes');
const app = express();
app.use(express.json());
app.use('/users', userRoutes);
app.listen(3000);
// routes/userRoutes.js
const router = require('express').Router();
const userController = require('../controllers/userController');
router.get('/', userController.getUsers);
router.get('/:id', userController.getUserById);
router.post('/', userController.createUser);
router.put('/:id', userController.updateUser);
router.delete('/:id', userController.deleteUser);
module.exports = router;
Этот промт экономит время, но не защищает от ошибок. Следующие промты добавят валидацию и обработку ошибок.
Промт №2: Middleware для валидации запросов с Joi
Назначение: создать middleware, который проверяет тело запроса перед передачей обработчику.
Промт:
«Создай middleware validate для Express с использованием Joi. Он должен принимать схему и проверять req.body, req.params и req.query. Если данные не проходят валидацию, возвращай 400 с детальным списком ошибок. Покажи пример схемы для создания пользователя (name, email, age).»
Пример ответа:
// middleware/validate.js
const validate = (schema) => (req, res, next) => {
const { error } = schema.validate(req.body, { abortEarly: false });
if (error) {
return res.status(400).json({ errors: error.details.map(d => d.message) });
}
next();
};
Как использовать: примените в маршрутах: router.post('/', validate(schema), userController.createUser). Joi — стандарт де-факто для валидации в Node.js, поэтому он выбран неслучайно.
Промт №3: Централизованная обработка ошибок
Назначение: единый интерфейс для ошибок в Express.
Промт:
«Создай middleware для обработки ошибок в Express. Он должен перехватывать все ошибки, логировать их и возвращать JSON в формате { error: "сообщение" }. Также добавь обработчик 404 и обертку для асинхронных функций. Используй класс ApiError для создания ошибок с HTTP-статусом.»
Пример ответа:
// middleware/errorHandler.js
class ApiError extends Error {
constructor(status, message) {
super(message);
this.status = status;
}
}
const errorHandler = (err, req, res, next) => {
const { status = 500, message } = err;
if (status === 500) console.error(err.stack);
res.status(status).json({ error: message });
};
Правильная обработка ошибок критична для API — без неё клиент получает неинформативные 500, а разработчик — пустые логи.
Промты для middleware
Промт №4: Настройка CORS
Назначение: разрешить доступ к API только с нужных доменов.
Промт:
«Настрой CORS для Express-приложения. Разреши запросы только с доменов https://example.com и http://localhost:3000. Используй пакет cors и методы GET, POST, PUT, DELETE. Выведи код подключения в app.js.»
Пример ответа:
const cors = require('cors');
const allowedOrigins = ['https://example.com', 'http://localhost:3000'];
app.use(cors({ origin: allowedOrigins }));
Без настройки CORS ваш API может стать жертвой межсайтовых атак или, наоборот, быть недоступным для легитимных клиентов.
Промт №5: Логирование запросов через Morgan
Назначение: видеть все входящие запросы в консоли.
Промт:
«Создай middleware для логирования HTTP-запросов с помощью morgan. Выбери формат "combined", в который входит IP, метод, URL, статус, размер ответа. Включи его сразу после создания приложения.»
Пример ответа:
const morgan = require('morgan');
app.use(morgan('combined'));
Формат combined — это стандарт для продакшена: он совместим с большинством систем сбора логов, такими как ELK.
Промты для аутентификации и авторизации
Промт №6: JWT-аутентификация с login-маршрутом
Назначение: реализовать выдачу и проверку токенов.
Промт:
«Реализуй аутентификацию с помощью jsonwebtoken. Создай маршрут POST /auth/login, который принимает email и пароль, находит пользователя в массиве (или БД) и возвращает JWT-токен с id пользователя в payload. Создай middleware verifyToken, который читает заголовок Authorization (Bearer token), проверяет подпись и добавляет req.user. Выведи код маршрута и middleware.»
Пример ответа:
// routes/auth.js
const jwt = require('jsonwebtoken');
router.post('/login', (req, res) => {
const user = users.find(u => u.email === req.body.email && u.password === req.body.password);
if (!user) return res.status(401).json({ error: 'Invalid credentials' });
const token = jwt.sign({ id: user.id }, process.env.JWT_SECRET, { expiresIn: '1h' });
res.json({ token });
});
// middleware/verifyToken.js
const jwt = require('jsonwebtoken');
module.exports = (req, res, next) => {
const header = req.headers.authorization;
if (!header) return res.status(401).json({ error: 'No token provided' });
const token = header.split(' ')[1];
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET);
req.user = decoded;
next();
} catch (err) {
res.status(401).json({ error: 'Invalid token' });
}
};
Не забудьте установить переменные окружения, а также использовать bcrypt для хеширования паролей — в промте можно добавить это требование.
Промт №7: Ролевая авторизация (RBAC)
Назначение: ограничить доступ к маршрутам по ролям (admin, user, etc.).
Промт:
«Добавь ролевую модель в Express. У пользователя есть массив roles: ["admin", "user"]. Создай middleware requireRole(role), который проверяет, есть ли у req.user нужная роль. Если нет — возвращай 403. Пример: маршрут DELETE /users/:id должен быть доступен только админу. Примени этот middleware к маршруту.»
Пример ответа:
const requireRole = (role) => (req, res, next) => {
if (!req.user?.roles?.includes(role)) {
return res.status(403).json({ error: 'Forbidden' });
}
next();
};
router.delete('/:id', verifyToken, requireRole('admin'), userController.deleteUser);
Обратите внимание на порядок middleware: сначала проверка токена, потом роли.
Промты для WebSocket
Промт №8: Чат на Socket.io
Назначение: создать мгновенный обмен сообщениями.
Промт:
«Создай WebSocket-сервер на Socket.io для чата. Интегрируй его с Express. Когда клиент отправляет событие "message" с текстом, сервер должен транслировать это сообщение всем подключенным клиентам. Используй комнаты, чтобы пользователи могли общаться в отдельных каналах. Покажи код сервера и пример клиентской части на HTML/JS.»
Пример ответа:
const http = require('http');
const server = http.createServer(app);
const io = new Server(server);
io.on('connection', (socket) => {
socket.join('general');
socket.on('message', (data) => {
io.to('general').emit('message', { user: socket.id, text: data.text });
});
});
server.listen(3000);
WebSocket-функциональность превращает скучный REST-сервер в реальное приложение с push-уведомлениями и чатом.
Промт №9: Отправка уведомлений через WebSocket
Назначение: таргетированные уведомления конкретному пользователю.
Промт:
«Реализуй систему уведомлений на Socket.io. При подключении пользователь передаёт свой userId. Сервер хранит соответствие userId и socket.id в Map. Когда событие "notification" с userId и сообщением отправляется, сервер находит активное соединение и отправляет событие "new-notification" этому пользователю.»
Пример ответа:
const onlineUsers = new Map();
io.on('connection', (socket) => {
socket.on('register', (userId) => onlineUsers.set(String(userId), socket.id));
});
function notify(userId, payload) {
const socket = onlineUsers.get(String(userId));
if (socket) io.to(socket).emit('new-notification', payload);
}
Таким образом вы можете отправлять уведомления о новых заказах, сообщениях и других событиях в реальном времени.
Дополнительные промты для продакшена
Промт №10: Пагинация и фильтрация в GET-списках
Назначение: сделать API удобным для работы с большими объёмами данных.
Промт:
«Добавь пагинацию и фильтрацию в маршрут GET /users. Параметры: page (1), limit (10), sortBy (name), filter (email). Возвращай объект: { data, total, page, totalPages }. Для фильтрации используй query-параметр filter, например ?filter=email:test@test.com.»
Пример ответа:
function paginate(data, { page = 1, limit = 10 } = {}) {
const offset = (page - 1) * limit;
return { data: data.slice(offset, offset + limit), total: data.length, page, totalPages: Math.ceil(data.length / limit) };
}
Промт №11: Документация API со Swagger
Назначение: автоматически генерировать документацию для ваших endpoints.
Промт:
«Создай Swagger-документацию для существующего Express API. Используй swagger-jsdoc и swagger-ui-express. Опиши в комментариях все endpoints: параметры, тело запроса, ответы, схемы. Подключи UI на /api-docs.»
Пример ответа:
const swaggerJsdoc = require('swagger-jsdoc');
const swaggerUi = require('swagger-ui-express');
const options = { definition: { openapi: '3.0.0', info: { title: 'API', version: '1.0.0' } }, apis: ['./routes/*.js'] };
const swaggerSpec = swaggerJsdoc(options);
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec));
После добавления комментариев в JSDoc-стиле документация будет обновляться автоматически.
Промт №12: Тестирование API с Jest и Supertest
Назначение: покрыть базовые сценарии работы API автотестами.
Промт:
«Напиши тесты для Express-приложения с использованием Jest и Supertest. Покрой следующие сценарии: успешное получение списка пользователей, создание нового пользователя, возврат 404 для несуществующего id, проверка валидации при неверных данных. После тестов закрывай сервер, чтобы процесс завершился.»
Пример ответа:
const request = require('supertest');
const app = require('../app');
afterAll(() => {
server.close();
});
describe('GET /users', () => {
it('should return 200 and array', async () => {
const res = await request(app).get('/users');
expect(res.statusCode).toBe(200);
expect(Array.isArray(res.body)).toBe(true);
});
});
Автотесты — это страховка от регрессий при изменениях кода. Даже простой smoke-тест уже окупается.
Как проверить качество промтов
Я часто тестирую промты на трёх критериях:
- Код запускается без ошибок после установки зависимостей.
- Соблюдены все требования из промта (порядок middleware, названия переменных).
- Код легко расширяется — нет хардкода, используются переменные окружения.
Если что-то не так — уточните промт: добавьте версию Node.js, используемую базу данных, требования к безопасности (например, «используй Helmet»).
Заключение
Промты из этой подборки покрывают базовый цикл разработки Express-приложения: от создания REST API до авторизации и WebSocket. Сохраняйте статью в закладки, чтобы в один клик получить рабочий код для типовых задач.
Но помните: промт — это лишь отправная точка. Всегда адаптируйте сгенерированный код под свой проект, проверяйте его на безопасность и пишите тесты. Если вы используете эти промты в своей работе, вы заметите, как ускоряется разработка.
Подпишитесь на блог, чтобы не пропустить подборки промтов для NestJS, PostgreSQL и других инструментов.
Комментарии