Настройка связи многие-ко-многим-сквозным между моделями с использованием таблицы соединений / сквозных соединений.
Это шестая часть серии статей о ExpressJS.
Вы можете найти Часть 1 здесь. В нем рассказывается о создании базового экспресс-API и настройке mocha для тестирования.
Вы можете найти Часть 2 здесь. В нем рассказывается о настройке PostgreSQL, sequelize для подключения экспресс-API к базам данных.
Вы можете найти Часть 3 здесь. В нем говорится о создании ассоциаций (как много, так и принадлежащих) между двумя моделями.
Вы можете найти Часть 4 здесь. В нем говорится о настройке аутентификации пользователя на основе электронной почты и пароля.
Вы можете найти Часть 5 здесь. В нем говорится об использовании веб-токена json для защиты маршрута.
В этой части серии мы возьмем модели User и Post, которые уже связаны через «Автор», и добавим еще одну связь, которая будет «Сохранена».
Один пользователь может иметь много сохраненных сообщений, и одно сообщение может быть сохранено многими пользователями.
Затем мы настроим соответствующие маршруты для проверки ожидаемого ответа.
- В конкретном сообщении должно быть указано, кто является его автором, а также кто его сохранил. Это не будет защищенный маршрут.
- У конкретного пользователя должны быть сообщения как автора, так и сохраненные сообщения. Это будет защищенный маршрут.
Давайте сначала займемся тестами -
Фабрики обновлений
Итак, мы настроили это двумя способами
post.addSavedBy(reader)
иreader.addSaved(post)
Это просто для демонстрации функций, предлагаемых sequelize на наших моделях.
Добавить конкретный пост-тест -
Теперь весь тест выглядит так -
Обновите наш тест JWT -
Поэтому мы проверяем как Written
сообщений, так и Saved
сообщений, связанных с нашим автором.
Итак, наши тесты готовы, пора писать код.
Добавить сквозную таблицу через миграцию
Мы создадим новую таблицу в нашей базе данных, в которой будет храниться только ассоциативная информация о том, какой пользователь какое сообщение сохранил.
Каждая строка в нашей сквозной таблице представляет собой действие сохранения - один пользователь сохранил одно сообщение.
Итак, если нам нужно найти все сохраненные сообщения для пользователя или для сообщения, которое его сохранило - мы будем (или, скорее, продолжим) использовать эту таблицу.
Это называется «Соединение или Сквозной стол».
Нам нужно создать миграцию, чтобы добавить таблицу в нашу базу данных.
migration:generate
иmigration:create
- это псевдонимы, которые достигают одной и той же цели - создания файла миграции.
Обновите файл миграции -
Поэтому мы называем это сквозной таблицей как SavedPosts
.
Пора использовать его для связывания наших моделей User
и Post
.
Добавить ассоциацию в моделях
Добавить в модель пользователя -
User.belongsToMany(models.Post, { through: ‘SavedPosts’, as: ‘Saved’ })
Добавить в публикацию модель -
Post.belongsToMany(models.User, { through: ‘SavedPosts’, as: ‘savedBy’ })
Здесь мы называем ассоциацию Saved
и SavedBy
в зависимости от модели. Имеет более семантический смысл сказать
- Пользователь сохранил сообщение
а также
- Сообщение было сохранено пользователем.
Запускаем миграцию -
sequelize db:migrate
как вы уже хорошо знаете.
Теперь мы успешно построили нашу сквозную таблицу, добавили связь для обеих моделей и соответственно обновили таблицы базы данных.
Пришло время подключиться к нашему потоку запросов / ответов с помощью маршрутов и контроллеров.
Добавить маршрут -
Мы переходим к routes/posts.js
и добавляем маршрут для конкретной публикации.
router.get(‘/:id’, postsController.getSpecificPost)
Этот маршрут обрабатывает запрос на следующий URL - например, https:<host>/posts/id
. https://articleWebsite.com/posts/7
. 7 - это идентификатор сообщения, который обрабатывается как параметр ИЛИ param
в нашем API.
Добавить метод в контроллер -
Добавьте метод getSpecificPost
в наш контроллер сообщений -
getSpecificPost
будет искать сообщение с совпадающим идентификатором и возвращать его в качестве ответа.
Обновить пользовательский контроллер -
Мы также обновим пользовательский контроллер, чтобы прикреплять сохраненные сообщения всякий раз, когда мы запрашиваем пользователя.
Итак, мы настроили маршруты и действия подключенного контроллера для обработки запросов, полученных по этим маршрутам. Мы также установили связи между моделями и выполнили миграции, чтобы отразить новые отношения в нашей таблице базы данных.
Теперь тесты должны стать зелеными, и это действительно так.
В следующей части серии мы поговорим о рефакторинге нашего API путем выделения методов запроса к базе данных в отдельные файлы и создания API RESTful.
Мы также добавим модульные тесты для наших моделей и контроллеров.
Craft Academy - это провайдер технического образования, целью которого является вывод на рынок новых талантов и помощь в решении нехватки технических работников. Мы основаны на убеждении, что современные стандарты разработки, гибкие методологии и бизнес-навыки имеют фундаментальное значение для ИТ-специалистов.
Наша основная услуга - это 12-недельный учебный курс по программированию, предназначенный для приобретения людьми основы навыков, которые позволят им войти в отрасль в качестве младших разработчиков.
Благодаря этому наши учащиеся находят работу в различных отраслях или открывают собственное дело, которое выводит на рынок новые инновации.
Хотите узнать больше о том, чем мы занимаемся? Подпишитесь на нас в Medium, Facebook, Twitter или посетите наш сайт.