Изначально я писал все свои 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 для повышения безопасности.