Изначально я писал все свои API внутри файла app.js
. Повторяя то, что я сказал в предыдущем посте относительно Layered Pattern
, хотя я, возможно, чувствовал, что это совершенно нормально структурировать мои API таким образом, как только код начинает становиться длиннее, и все больше и больше API создается в одном файле, это станет чрезвычайно сгруппированным и дезорганизованным. Чтобы предотвратить такое событие, используется многоуровневый шаблон.
Дополнительные сведения о многоуровневом шаблоне:
https://medium.com/@inni.chang95/layered-pattern-b27a10e1924c
Сначала я сделал 3 разные папки
mkdir routes mkdir controllers mkdir services mkdir models
Каждый файл будет содержать разные наборы кодов.
В файле маршрутов я собираюсь создать разные файлы router.js, указывающие, как будут обрабатываться каждый HTTP-метод и конечная точка.
В моем index.js
, в зависимости от того, какую конечную точку содержит запрос, он направит запрос на разные маршрутизаторы.
Первая строка, конечно, так как я использую Express.js
фреймворк, я должен импортировать пакет.
const userRouter = require('./userRouter')
Соединяет каждую константу с соответствующими файлами маршрутизатора.
const router = express.Router();
назначает функцию маршрутизатора Express framework константе router
.
Затем я использую эту новую константу для направления входящего запроса в разные файлы.
Если я получу запрос /posts, это приведет к моему файлу postRouter.js
.
В моем файле postRouter.js
у меня есть все конечные точки, используемые для всех действий, связанных с «сообщениями».
В зависимости от того, какой запрос или дополнительную конечную точку имеет запрос, это приведет к разным действиям. Поскольку я использую метод GET
дважды, я установил дополнительный /user
, чтобы прояснить разницу между ними. Другие были оставлены пустыми, потому что я хочу быть RESTful
. Давайте рассмотрим один из маршрутов, по которым может идти запрос.
Если конечной точкой является /posts
, с помощью метода delete
это приведет к postController.deletePost
, который выглядит так:
На уровне представления выполняются все HTTP-соединения, и конечные точки выравниваются. Он также проверяет действительность полученного тела или ключа.
Эта функция принимает параметр userId and postId
в теле. Он быстро определяет, присутствуют ли эти два значения BOTH
. IF NOT
, он вернет сообщение «Не удается найти сообщение» с кодом состояния 400. В противном случае ожидает возврата от postService.deletePosts
и таким же образом отправляет параметр userId and postId
.
На бизнес-уровне применяется бизнес-логика компании. Однако в моем случае я не мог придумать какой-либо конкретной бизнес-логики для удаления сообщения, поэтому я сделал это довольно просто.
Я использовал try…catch statement
, чтобы сохранить целостность. Просто код пытается дождаться возврата от deletePost()
со следующего слоя postDao
, иначе выдает ошибку. Таким образом, этот код пытается дождаться deletePost()
от postDao
, но если что-то пойдет не так, он выдаст ошибку.
На уровне постоянства выполняется вся логика, связанная с базой данных.
Он получает параметр userId and postId
, затем запускает его через базу данных, запрашивая DELETE из таблицы сообщений, где posts.user_id и posts.id соответствуют userId и postId соответственно. Если он не сможет выполнить оператор запроса, он выдаст ошибку.
В случае успеха он вернет значение из запроса обратно.
Мне действительно понравилась организация Layered Pattern больше, чем просто создание всего в app.js по многим причинам. Главное, чтобы было так легко ловить и исправлять ошибки. Поскольку я настроил его так, чтобы каждый слой отображал разные ошибки, я мог просто сначала сосредоточиться на поиске ошибки в этом слое и распространить его на другой соприкасающийся слой.
Сначала я был так поражен всем, что мне нужно было отслеживать. Имена переменных, маршрутизирующие соединения и имена функций поначалу казались мне запутанными. Но как только я во всем разобрался и взял себя в руки, все потекло, как нежная река.
Далее я попытаюсь реализовать процесс авторизации/аутентификации с использованием Bcrypt и JWT для повышения безопасности.