Пришло время приступить к четвертому и окончательному заданию этого курса.
Я разработал это задание, чтобы консолидировать
все, что вы узнали в этом курсе.
Таким образом, это назначение будет включать маршрутизацию с использованием экспресс-маршрутизатора.
Это будет включать в себя дизайн схем в модели,
для наших MongoDB и Mongoose,
а затем он будет кратко смотреть на аутентификацию пользователя.
Что именно мы делаем в этом задании?
Это назначение основано на возможности для пользователя
сохранять и извлекать список блюд в качестве их любимых блюд на стороне сервера.
Если вы проходили предыдущие курсы этой специализации,
в частности курсы разработки гибридных мобильных приложений,
будь то ионный или родной сценарий,
вы видели, что мы разработали приложения, чтобы иметь возможность позволить пользователю
сохранять блюда в списке их любимых блюда,
а также получить блюда из этого списка их любимых блюд.
Когда мы реализовали это в предыдущих курсах,
мы реализовали это, используя локальное хранилище на конкретном устройстве.
В этом назначении вы будете расширять
серверную сторону, чтобы иметь возможность поддерживать именно это.
Таким образом, пользователь может сохранить свой список любимых блюд на
стороне сервера и получить доступ к этому списку с
любого устройства, с которого он будет входить на свой сервер.
Это означает, что нам нужно разработать новый маршрут для нашего сервера,
который мы будем называть маршрутом/избранным.
На этом маршруте нам придется разработать экспресс-маршрутизатор для поддержки
операций получения, отправки и удаления на этом маршруте, а
также разработать схему для хранения любимых блюд
и соответствующей модели Mongoose и
соединить их вместе, чтобы информация могла быть сохранена и извлечен из MongoDB.
Мы также будем использовать популяцию Mongoose для того, чтобы извлечь информацию из
модели пользователя и из модели блюд, когда мы
составим этот список любимых блюд для нашего пользователя.
Информация о любимых блюдах, которую вы храните,
на самом деле не содержит ни информации о пользователе, ни информации о блюде.
Вместо этого он будет содержать указатели на документы для документа блюдо и для
документа пользователя, а затем мы будем публиковать эту информацию,
когда мы отправляем обратно эту информацию в ответ на запрос получить.
Давайте посмотрим, как мы реализуем
это окончательное задание, а также различные задачи в этом окончательном задании.
Чтобы помочь вам понять, что требуется в
окончательном назначении или что вы будете реализовывать в окончательном назначении,
позвольте мне продемонстрировать, что ваш сервер должен делать в конце этого задания,
а затем я перечислю три задачи, которые вам нужно выполнить в этом назначение.
Чтобы начать работу, нам нужен набор блюд уже
на стороне сервера, чтобы пользователь мог пометить некоторые из них как их любимые блюда.
Я пошел вперед и добавил четыре блюда в мой список блюд на стороне сервера.
Ты уже знаешь, как это сделать.
Вы должны войти в систему как администратор, а затем
опубликовать эту информацию на стороне сервера один за другим.
Чтобы вы могли получить информацию для каждого из этих блюд,
я уже предоставил вам файл db.json, который содержит
документы JSON, соответствующие каждой из этих блюд в ресурсах назначения.
Вы можете открыть это, вырезать и вставить информацию оттуда, а затем
создать список блюд на стороне сервера.
Здесь вы увидите, что я уже выполнил операцию get на
локальном хосте: 3000/блюда, а затем вы
видите, что я уже получил список блюд здесь.
Для нас важно отметить, что каждое блюдо будет иметь свой собственный идентификатор блюда здесь.
Когда вам нужно пометить любое блюдо как любимое,
вам нужен доступ к идентификатору блюда для каждого из этих блюд.
Вы можете скопировать эти четыре идентификатора блюд, а затем сохранить их так, что при
выполнении операций по добавлению этих блюд в список блюд,
то вы сможете использовать этот идентификатор блюда.
Поэтому я собираюсь скопировать эти четыре идентификатора посуды, а затем сохранить
их в текстовом документе, чтобы я мог использовать их.
Прежде чем я смогу добавить блюда в свой список блюд,
мне, очевидно, нужно войти в систему как пользователь.
Позвольте мне идти вперед и войти в систему как один из пользователей.
Для этого позвольте мне сделать сообщение на локальном хосте: 3000/пользователей/логин.
И в теле сообщения
позвольте мне ввести одного из зарегистрированных пользователей.
Я не хочу входить в систему как администратор, но как один из других обычных пользователей.
Поэтому позвольте мне сделать этот пост на https://localhost:3443.
Теперь все эти операции,
это лучше сделать на конечной точке HTTPS, а не на конечной точке HTTP.
Мы сделаем сообщение на эту конечную точку и войдем в наш сервис,
и в ответ вы должны иметь возможность получить веб-токен JSON.
Итак, давайте сделаем копию этого JSON веб-токена, потому что нам понадобится это для
выполнения любой из операций по добавлению блюд в наш список избранных.
Позвольте мне скопировать этот токен и сохранить его в моем текстовом документе.
Теперь, как добавить блюдо в список избранного?
Для этого первым шагом является то, что мы должны
получить доступ к конечной точке /favorites.
Если вы хотите добавить конкретное блюдо в список избранного,
мы просто скажем /избранное, а затем добавим идентификатор блюда в URL-адрес здесь.
Позвольте мне вставить идентификатор блюда, который я хочу добавить в свой список избранного.
Здесь я вставил в свой идентификатор блюда в список избранного.
Тело этого сообщения хоста
не будет содержать ничего, потому что все, что мне нужно, уже находится в URL-адресе.
И для заголовка
мне нужно настроить заголовок авторизации,
а в заголовке авторизации
мне нужен токен.
Поэтому позвольте мне скопировать токен здесь, а затем в заголовке авторизации,
скажем на носителя, и вставить в заголовок авторизации.
Вы также можете сделать то же самое, чтобы получить токен.
Вы также можете выполнить вход через Facebook, а затем получить веб-токен JSON.
Я проиллюстрировал, чтобы получить веб-токен JSON, используя
стандартную локальную аутентификацию с использованием имени пользователя и пароля,
но неважно, каким образом вы получили веб-токен JSON.
Пока у вас есть веб-токен JSON,
вы должны иметь возможность выполнять все эти операции.
Позвольте мне выполнить пост-операцию на этой конечной точке и помнить, что
это идентификатор блюда для конкретного блюда, которое я хочу добавить в свой список избранного.
Когда я отправляю сообщение в список избранного,
вы увидите, что мой сервер ответит обратно с этим документом здесь, в теле ответа.
Теперь давайте рассмотрим этот документ, чтобы узнать, что именно он содержит.
Этот документ, как вы можете видеть, содержит идентификатор,
но, очевидно, потому что это документ JSON,
кроме того, он содержит
поле, называемое пользователем.
Что теперь хранит это пользовательское поле?
Это поле пользователя является идентификатором объекта пользователя
, которому соответствует данный конкретный список избранного.
И посмотри на посуду.
Блюда представляют собой массив и это массив идентификаторов блюд.
И в этом случае, я только что добавил первое блюдо в свой список избранного.
Вот почему у меня есть только одно блюдо в ассортименте блюд в моем списке фаворитов.
Таким образом, это должно немедленно предложить вам, как спроектировать схему для ваших избранных.
Таким образом, блюда содержат идентификаторы объектов каждой из блюд,
а пользователь содержит идентификатор объекта, соответствующий пользователю.
Вы уже видели, как я использую
информацию для заполнения информации, когда я делаю операцию get.
Мы уже сделали это с комментариями.
Таким образом, это должно дать вам большой намек на то, как вы будете разрабатывать схему, которая содержит
пользователя и массив блюд в моем списке блюд здесь.
Теперь, мы сделали сообщение об этом.
Давайте получим список фаворитов.
Поэтому, чтобы получить список избранного,
мне нужно выполнить операцию get.
Теперь, для операции get,
мне, очевидно, нужно также иметь информацию об авторизации здесь, потому что
вы хотите, чтобы пользователь мог получать только свой список избранного,
и ни один другой пользователь не может получить список избранного для другого пользователя.
Так что, это очень важно.
Таким образом, это говорит о том, что вам нужно
проверить подлинность пользователя даже для операции get.
Теперь, как пост-операция
автоматически получает этот идентификатор объекта, соответствующий пользователю?
Напомним, что когда вы включаете заголовок авторизации здесь,
из заголовка авторизации,
кстати, вы выполняете авторизацию пользователя,
направляйте эти пользовательские свойства, уже загруженные на объект запроса.
И вот где вы получите доступ к идентификатору объекта пользователя.
Итак, еще один намек на то, как вы будете заполнять эту информацию.
Поэтому обратите внимание, что, когда я выполнял сообщение,
я никогда не указывал пользователя, потому что
информация пользователя должна автоматически быть
получена из того, что мы предоставили здесь в заголовке авторизации.
Итак, еще один намек на то, как вы будете осуществлять это.
Вот почему я сказал, что это задание является
консолидацией всех тем, которые вы изучили в этом курсе.
Теперь я не поддерживаю операцию get для определенного идентификатора тарелки.
Это не имеет смысла поддерживать это в избранном,
в конкретном идентификаторе блюда.
Вместо этого мы можем выполнить операцию get на локальном хосте 3443/избранное.
А затем мы выполняем операцию get.
Вы сразу заметите, что возвращаемый документ содержит
информацию о пользователе, уже заполненную операцией получения здесь.
Итак, информация пользователя.
Таким образом, вместо
идентификатора пользователя там информация пользователя уже присутствует там.
Это делается через население Монго.
Итак, это еще один большой намек на то, как вы должны реализовать операцию get.
Заполняется не только информация пользователя.
Теперь почему я хочу, чтобы информация пользователя была заполнена?
Потому что это может быть полезно, когда я отображаю информацию.
Это может быть не нужно,
но я просто делаю это ради полноты,
потому что если вы извлекаете список избранного для конкретного пользователя,
вы автоматически знаете, кто такой пользователь,
и этот конкретный пользователь все равно входит в систему.
Но в случае, если вам нужна информация пользователя,
вы можете выполнить эту операцию, чтобы получить информацию этого пользователя.
Итак, просто чтобы проиллюстрировать вам, что население Монго может быть использовано,
я проиллюстрировал не только то, что в списке блюд здесь
информация о каждом блюде уже заполнена в этом массиве.
Итак, если у вас есть куча блюд,
информация о каждом из этих блюд должна быть заполнена в этом массиве.
Таким образом, это еще одно использование населения Монго
, что вы видите, чтобы заполнить информацию о блюдах.
Просто, кстати, вы настроили схему для ваших избранных,
это должно быть автоматически возможно для вас, используя
только точку заполнения в списке блюд здесь.
Итак, это вторая часть.
Теперь, когда мы можем получить метод получения блюд,
позвольте мне показать вам, как вы можете выполнить послеоперационную операцию, где вы можете
добавить кучу блюд в свой список избранного.
Теперь, возвращаясь к этому сообщению,
если вам нужно добавить не только один, но и набор блюд в свой список фаворитов,
почему вы хотите этого?
Может быть, на стороне клиента у вас может быть кнопка, которая при
нажатии позволит вам отметить набор блюд из списка блюд,
а затем добавить их одним выстрелом в ваш список избранного.
Таким образом, чтобы поддержать такую операцию,
вы можете разрешить выполнение сообщения на слэш избранное здесь.
Теперь, когда сообщение выполняется на слэш избранное, опять же,
вам все равно понадобится заголовок авторизации.
Но в теле сообщения,
мы будем хранить список блюд в виде массива этого формата.
Итак, это документ JSON здесь,
поэтому позвольте мне убедиться, что в моем заголовке
тип содержимого уже присутствует там.
Теперь этот документ будет
содержать массив блюд вроде этого.
Таким образом, каждое блюдо будет идентифицировано,
сказав подчеркивание ID двоеточия,
а затем здесь они будут иметь идентификатор блюда,
и поэтому это будет не что иное, как массив блюд.
Итак, позвольте мне добавить два блюда в мой список избранного здесь, чтобы проиллюстрировать суть.
Итак, позвольте мне вставить в это идентификаторы из парочки блюд.
Итак, когда вы выполняете сообщение на локальном хосте 3443/избранное,
вот как вы составляете тело сообщения здесь.
Таким образом, каждое блюдо, которое вы хотите добавить, будет включено в этот формат здесь.
Теперь, когда вы включаете их в этот формат,
а затем отправляете
на эту сторону сервера, сервер взамен отправит вам обновленный список избранного.
Итак, когда вы получите обновленный список избранного со стороны сервера,
вы увидите, что информация пользователя уже есть,
но обратите внимание, как любимые блюда хранятся в этом массиве идентификаторов объекта блюда.
Итак, первый, который мы уже добавили в предыдущей операции.
Итак, остальные два
мы только что добавили в список наших избранных.
Таким образом, эти два идентификатора объектов также добавляются в
мой массив блюд в моем документе «Избранное» здесь.
Так вот, ты идешь. Итак, вот как вы должны выполнять
сообщение избранного на конечной точке, как это.
Теперь давайте снова выполним операцию get
на избранном, чтобы увидеть, какие функции get операции для нас.
Поэтому, когда мы выполняем операцию GET,
вы сразу заметите, что в возврате избранного документа
у вас есть информация пользователя там,
а затем ниже здесь,
блюда - это не что иное, как массив документов Json здесь,
каждый из которых соответствует блюду.
Теперь об этом автоматически заботится
заполнение мангуста, которое мы сделали на стороне сервера.
Таким образом, вся эта информация должна быть автоматически заполнена на стороне сервера.
Так вот, как работают ваши почтовые операции на двух конечных точках.
Теперь позвольте мне показать вам, как вы будете выполнять операцию DELETE.
Теперь удалить конкретное блюдо.
Поэтому позвольте мне выполнить операцию удаления на конкретной конечной точке.
Итак, мы вернемся к этой конечной точке,
а потом позволь мне скопировать одну из них,
а потом я удалю одну из тарелок.
Так что для выполнения операции удаления одной из тарелок,
конечно, как вы видите,
нам еще не нужно тело,
и нам не нужно содержание здесь.
Все, что нам нужно сделать, это выполнить операцию удаления на этой конечной точке.
Итак, здесь вы видите, что я делаю localhost: 3443/favorites/, а затем идентификатор блюда.
А потом позвольте мне опубликовать это.
Поэтому, когда я удаляю конкретное блюдо из моего списка избранного,
вы сразу замечаете, что
мой обновленный список избранного отправляется обратно на клиентскую сторону сервером.
Итак, у вас есть пользователь здесь,
но обратите внимание, что в массиве блюд у меня теперь только два блюда.
Тот, который я только что удалил, ушёл из этого списка блюд.
Поэтому, если вы выполняете GET сейчас,
ваш массив блюд будет постоянно к блюдам там.
Теперь предположим, что я выполняю DELETE в избранном здесь.
Поэтому, если я выполняю DELETE непосредственно на конечной точке избранного,
то то что он собирается сделать, это удалить все мои избранные, а
также полностью удалить мой документ избранного со стороны сервера.
Поэтому позвольте мне выполнить эту операцию удаления на стороне сервера,
а затем он вернет тот факт, что он удалил этот конкретный документ,
поэтому он просто возвращает этот документ в любом случае.
Но теперь, если я выполняю операцию GET в моем списке избранного,
я извлечу нуль там.
Это означает, что у меня нет этого документа на стороне сервера.
Таким образом, документ «Избранное» полностью исчез,
когда я выполняю операцию DELETE в локальном столбце три из прежних косой черты избранного.
Теперь снова, когда я добавляю новое блюдо в свой список избранного,
мой документ «Избранное» будет настроен снова.
Это прекрасно для нас, чтобы оперировать.
Таким образом, с этой демонстрацией я показал вам
все различные операции, которые вам нужно выполнить на стороне сервера.
Все различные операции на различных конечных точках маршрута
, которые необходимо выполнить или реализовать на стороне сервера.
Теперь, когда вы видели
все различные операции, которые должна поддерживать сторона сервера на слэш избранное,
а также слэш избранное,
косая косая тарелка конечных точек,
позвольте мне перечислить три задачи, которые вам нужно выполнить в этом задании.
Первая задача, конечно, заключается в реализации любимой схемы и модели.
Это вы будете реализовывать в папке моделей в файле, называемом избранным NodeJS.
Там вы будете реализовывать любимую схему.
Помните, что в избранной схеме будет
храниться ссылка на идентификатор объекта документа пользователя
и массив идентификаторов объектов документа посуды.
Это большой намек на то, как вы должны
проектировать схему и модель для ваших любимых.
Вторая задача в вашем назначении заключается в реализации
операций GET, POST и DELETE на конечной точке избранного косой черты.
GET получит вам весь список избранного,
автоматически заполненный заполнением Mongo,
POST должен содержать список блюд, как указано
в формате, который я только что продемонстрировал вам в теле сообщения POST.
Таким образом, куча блюд будет добавлена в ваш список избранного,
а операция DELETE на конечной точке слэша избранное
полностью удалит ваш документ избранного со стороны сервера.
Теперь, если вы выполняете операцию POST на косой чертой любимого кода косой черты,
то конкретное блюдо будет добавлено в ваш список избранного.
Если ваш любимый документ не существует,
вам, очевидно, нужно создать этот любимый документ.
Таким образом, это также часть этой операции POST.
Поэтому, если в какой-то момент вы обнаружите, что любимый документ не существует,
вам нужно сначала создать любимый документ, а
затем добавить это блюдо в любимый документ.
Так что это важный момент, который следует также отметить.
При выполнении POST на конечной точке «Избранное» косой черты,
если избранного документа не существует,
необходимо создать избранный документ, а затем добавить блюда в избранное.
Если он уже существует,
вы обновляете только этот любимый документ.
Таким образом, это еще один намек на то, как вы должны реализовать операции POST.
Если вы выполняете операцию DELETE для косой черты «Избранное» косой черты,
то это конкретное блюдо будет удалено из списка избранного.
Теперь при выполнении операций POST и DELETE
вы должны убедиться, что вы не будете добавлять дубликаты в идентификатор блюда.
Поэтому перед тем, как добавить идентификатор объекта блюда в список блюд,
всегда проверяйте, есть ли идентификатор блюда уже в списке блюд.
Теперь это то, где вы можете использовать метод array IndexOf, чтобы
проверить, существует ли идентификатор документа уже в массиве документов.
Так что это еще один большой намек на то, как вы собираетесь реализовать эту часть.
И третья задача, конечно же, состоит в том, чтобы смонтировать
любимый маршрутизатор на конечных точках слэша избранного путем обновления файла app.js.
Сам любимый маршрутизатор будет реализован
в папке маршрутов в файле favoriterouter.js.
Поэтому с этим я описал, что вы
должны реализовать в четвертом и последнем задании.
И я надеюсь, что это задание поможет вам
консолидировать все, что вы узнали в ходе курса,
от проектирования экспресс-маршрутизатора
до выполнения MongoDB, а также схемы и модели Mongo,
а также выполнения соответствующей аутентификации пользователя.
И, как я уже упоминал,
только аутентифицированный пользователь получит доступ к своему списку избранного.
Даже операция GET может выполняться только
аутентифицированным пользователем в конечной точке «Избранное» косой черты.
И вы будете получать только избранное для этого конкретного пользователя.
Нельзя разрешить другому пользователю доступ к избранному другого пользователя.
Опять же, это также говорит вам, как вы должны выполнять
аутентификацию на разных конечных точках маршрута.
С этим я завершу описание задач в четвертом задании.
Получайте удовольствие, выполняя это задание.