Основы Для создания полноценного frontend пет проекта не обойтись без бекенда. Но у начинающих зачастую нет возможности и времени изучать бекенд и фронтенд одновременно. В этой статье я расскажу, как сделать полноценную имитацию бекенда со всеми возможностями в 50 строк кода (сложные реляционные схемы данных, сортировка, поиск, фильтрация, пагинация, авторизация и др.). Установим пакет - https://github.com/typicode/json-server npm install -g json-server После чего, в корне проекта создадим отдельную папку рядом с src и назовем ее json-server. Внутри создадим два файла: db.json – база данных index.js – сам сервер Рассмотрим структуру файла db.json В этот файл можно добавлять любые сущности, для них сразу же будут созданы ендпоинты: GET ALL – получить все, на примере постов отправляем гет запрос по адресу /posts GET ONE – получить один пост, /posts/1 в таком случае получим пост с id = 1 POST – для создания нового поста необходимо отправить post запрос на адрес /posts где в качестве тела запроса указываем сам пост DELETE - /posts/1 удалить пост с id = 1 PUT – изменить пост Обратите внимание, что у комментариев есть поле postId, по нему идет связь. Если вы хотите получить все комментарии, которые указаны к посту с id = 1, вы должны отправить вот такой запрос с query параметром GET /posts/1?_embed=comments или /posts/1/comments Подробнее тут - https://github.com/typicode/json-server#relationships Все данные поддаются фильтрации, пагинации, сортировке и поиску, подробные примеры можно посмотреть в документации. Рассмотрим на примере сортировки. Хотим отсортировать список постов по просмотрам: GET /posts?_sort=views&_order=asc К строке запроса добавляем два query параметра _sort=”views”, здесь можно указать любое поле, по которому хотим сортировать _order=’направление сортировки’ asc|desc – по убыванию или возрастанию Аналогичным образом работает и пагинация, и поиск и тд. Примеры есть в документации. Запустить сервер очень просто. Достаточно написать команду и указать путь до файла db.json. json-server --watch ./json-server/db.json Авторизация В предыдущем разделе мы рассмотрели простой сервер с базой данных. Иногда, для создания полноценного приложения нам может понадобиться авторизация. Имитацию авторизации сделать крайне просто. В папке jsonserver создадим файлик index.js и установим пакет, но уже локально, как DEV зависимость. npm install –D json-server В db.json необходимо добавить еще одну сущность users После чего заходим в файл index.js и вставляем такой код const fs = require('fs'); const jsonServer = require('json-server'); const path = require('path'); const server = jsonServer.create(); const router = jsonServer.router(path.resolve(__dirname, 'db.json')); server.use(jsonServer.defaults({})); server.use(jsonServer.bodyParser); // Нужно для небольшой задержки, чтобы запрос проходил не мгновенно, имитация реального апи server.use(async (req, res, next) => { await new Promise((res) => { setTimeout(res, 800); }); next(); }); // Эндпоинт для логина server.post('/login', (req, res) => { try { const { username, password } = req.body; const db = JSON.parse(fs.readFileSync(path.resolve(__dirname, 'db.json'), 'UTF-8')); const { users = [] } = db; // находим в бд пользователя с таким username и password const userFromBd = users.find( (user) => user.username === username && user.password === password, ); if (userFromBd) { return res.json(userFromBd); } return res.status(403).json({ message: 'User not found' }); } catch (e) { console.log(e); return res.status(500).json({ message: e.message }); } }); // проверяем, авторизован ли пользователь server.use((req, res, next) => { // разрешаем публичный доступ без авторизации if (req.path === '/public/path') { return next(); } // для всех остальных маршрутов запрещаем if (!req.headers.authorization) { return res.status(403).json({ message: 'AUTH ERROR' }); } next(); }); server.use(router); // запуск сервера server.listen(8000, () => { console.log('server is running on 8000 port'); }); Теперь для запуска сервера используем новую команду node ./json-server/index.js Этот код добавляет эндпоинт для логина. Вы отправляете по адресу /login POST запрос и в теле указываете password и username. Если пользователь найден в базе с такими данными, то он вернется в теле ответа от сервера. Также в этом коде есть middleware, который проверяет авторизованность пользователя. Для того чтобы пройти эту проверку необходимо во всех запросах отправлять заголовок authorization с любым значением (имитация токена). headers.authorization = “12312312”. Если токена нет, то сервер вернет 403 статус код. Т.е. действия по итогу такие: Вы отправляете запрос на /login с паролем и именем пользователя. Если пользователь найден вам возвращаются данные о нем. После успешного ответа от сервера вы добавляете рандомное значение в localstorage, а затем используете его для установки заголовка authorization, например, так: Теперь вам доступны все защищенные эндпоинты. Если вы хотите разлогиниться, то достаточно удалить токен из localstorage. Такой подход делает все эндпоинты кроме /login приватными. Если вам нужны публичные эндпоинты, то вы можете добавить вот такую проверку в middleware: server.use((req, res, next) => { // разрешаем публичный доступ без авторизации if (req.path === '/posts') { return next(); } // для всех остальных маршрутов запрещаем if (!req.headers.authorization) { return res.status(403).json({ message: 'AUTH ERROR' }); } next(); }); В данном случае все запросы по пути /posts станут публичными. Заключение Таким образом, буквально за 5 минут можно поднять сервер, обладающий большими возможностями.