Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Привет, друзья!
В этом небольшом туториале я хочу показать вам, как разработать простой, но довольно-таки полноценный сервер для тестирования API
.
Основной функционал нашего приложения будет следующим:
- админка с возможностью добавления данных (далее — проекты) путем их набора (ввода) или копирования/вставки, либо путем загрузки файла;
- сохранение проектов на сервере;
- безопасная запись, чтение и удаление файлов на любом уровне вложенности;
- получение названий существующих проектов и их отображение в админке;
- возможность редактирования и удаления проектов;
- унифицированная обработка
GET
,POST
,PUT
иDELETE
запросов к любому существующему проекту, включаяGET-запросы
, содержащие параметры и строки запроса; - обработка специальных параметров строки запроса
sort
,order
,limit
иoffset
; - и многое другое.
Наша админка будет выглядеть так:
Для быстрой стилизации приложения будет использоваться Bootstrap
.
Исходный код проекта находится здесь.
Разумеется, с приложением, которое мы с разработаем, сразу в продакшн не пойдешь, но при необходимости довести его до производственного уровня не составит труда.
При разработке приложения мы будет придерживаться 2 важных условий:
- формат данных —
JSON
; - основная форма данных — массив.
Обратите внимание: статья рассчитана, преимущественно, на начинающих разработчиков, хотя, смею надеяться, что и опытные найдут в ней что-нибудь интересное для себя.
Вы готовы? Тогда вперед.
Подготовка проекта
Создаем директорию для проекта, переходим в нее, инициализируем проект и устанавливаем зависимости:
mkdir mock-api
cd !$
yarn init -y
# or
npm init -y
yarn add express multer nodemon open-cli very-simple-fetch
# or
npm i ...
Зависимости:
express
—Node.js-фреймворк
для разработки сервераmulter
— обертка надbusboy
, утилита для обработки данных в форматеmultipart/form-data
, часто используемая для сохранения файловnodemon
— утилита для запуска сервера для разработкиopen-cli
— утилита для автоматического открытия вкладки браузера по указанному адресуvery-simple-fetch
— обертка надFetch API
, упрощающая работу с названным интерфейсом
Открываем package.json
, определяем в нем основной файл сервера (index.js
) как модуль и команду для запуска сервера для разработки:
{
"type": "module",
"scripts": {
"dev": "open-cli http://localhost:5000 && nodemon index.js"
}
}
Команда dev
указывает открыть вкладку браузера по адресу http://localhost:5000
(адрес, на котором будет запущен сервер) и выполнить код в файле index.js
(запустить сервер для разработки).
Структура нашего проекта будет следующей:
projects
— директория для проектовpublic
— директория со статическими файлами для админкиroutes
— директория для роутовindex.js
— основной файл сервераutils.js
— вспомогательные функции
Пожалуй, проект готов к разработке. Не будем откладывать на завтра то, что можно отложить на послезавтра сделать сейчас.
Сервер, маршрутизатор для проектов и утилиты
В файле index.js
мы делаем следующее:
- импортируем
express
, полный путь к текущей (рабочей) директории и роуты для проектов; - создаем экземпляр
Express-приложения
; - добавляем посредников (промежуточных обработчиков): для обслуживания статических файлов, для разбора (парсинга) данных в
JSON
, для декодированияURL
; - добавляем роут для получения файлов из директории
node_modules
; - добавляем роуты для проектов;
- добавляем обработчик ошибок;
- определяем порт и запускаем сервер.
import express from 'express'
import { __dirname } from './utils.js'
import projectRoutes from './routes/project.routes.js'
const app = express()
app.use(express.static('public'))
app.use(express.json())
app.use(express.urlencoded({ extended: true }))
app.get('/node_modules/*', (req, res) => {
res.sendFile(`${__dirname}/${req.url}`)
})
app.use('/project', projectRoutes)
// обратите внимание: обработчик ошибок должен быть последним в цепочке посредников
app.use((err, req, res, next) => {
console.error(err.message || err)
res.sendStatus(err.status || 500)
})
const PORT = process.env.PORT || 5000
app.listen(PORT, () => {
console.log(`