Вторая часть этого упражнения касается
различных операций get put post и delete на вложенных документах внутри документа.
Как мы видели в примере для блюд,
мы видели, что комментарии включены внутри самого блюда в качестве поддокумента,
в том, как мы определили схему комментариев
и схему блюда, а затем определили модель
блюда, включив схему комментария как массив комментарии.
И мы видели в предыдущем упражнении, как комментарии заключены внутри
массива в виде массива документов внутри каждого документа блюдо.
Итак, как мы вносим изменения в сами комментарии?
Как мы получим весь список комментариев к блюду?
Как изменить конкретный комментарий в блюде и так далее?
Так что это то, что мы увидим о том, как
поддерживать их, используя различные операции get put post и удаления на
блюдо блюда косую косую косую косую чашу комментарии косую
косую косую косую косую косую косую косую косую косую косую
Чтобы приступить к этому упражнению
, снова возвращаясь к блюжному маршрутизатору,
они уже видели, как мы обрабатываем конечную точку косой черты и конечную точку идентификатора косой черты.
Теперь большая часть этой работы, которую мы здесь делаем, уже полезна для нас,
так что я собираюсь сделать, это скопировать этот код,
а затем мы отредактируем этот код соответствующим образом, чтобы обрабатывать комментарии и идентификатор комментария.
Поэтому я собираюсь скопировать весь этот код, который у нас есть
здесь как для косой черты, так и для косой черты золотого блюда ID,
а затем мы вставим его прямо ниже здесь снова.
И тогда мы зайдем и модифицируем каждый из них.
Таким образом, мы видели, что если вы посмотрите назад,
первый из них обрабатывает слэш, который будет установлен на конечной точке слэш блюда.
А следующий - обработка идентификатора тарелки.
Таким образом, третий должен обрабатывать комментарии косой черты кода косой черты.
Таким образом, спускаясь сюда,
этот третий маршрут маршрутизатора блюд будет косой чертой кода косой черты.
И тогда последним, конечно,
будет код косой черты кода косой черты,
а затем косой черты двоеточия комментария ID.
Итак, теперь, когда мы обновили эти маршруты здесь,
теперь следующий шаг - войти и исправить
код в операциях get put post и удаления здесь.
Таким образом, мы начнем с косой черты идентификатор косой черты комментариев конечной точки.
Так что в случае слэш блюдо ID косой черты комментарии конечной точки,
так что мы будем делать блюда найти, но вместо того, чтобы сказать блюда найти,
мы будем делать блюда найти по
ID, и поэтому мы найдем конкретное блюдо, которое мы ищем.
Итак, здесь мы будем искать, что req params блюдо ID,
поэтому мы сначала будем искать блюдо,
и так это вернет конкретное блюдо.
Поэтому, когда он возвращает это конкретное блюдо здесь,
то то, что они будут проверять внутри здесь,
это то, что если блюдо не равно нулю.
Вполне возможно, что блюдо не существует,
поэтому если мы ищем конкретное блюдо с идентификатором блюда,
это блюдо может не существовать,
поэтому нам нужно беспокоиться о том, чтобы справиться с этой конкретной ситуацией.
Итак, давайте рассмотрим эту часть внутри,
и поэтому, если она не равна нулю, то это означает, что блюдо существует.
Так что я собираюсь вырезать это и вставить его туда.
И тогда в этом случае,
так как блюдо не является нулевым,
поэтому мы вернем код состояния и заголовок набора,
а затем здесь мы будем возвращать комментарии к блюду,
потому что нас просят вернуть только комментарии к этому конкретному блюду, так что мы скажем:
«Блюда найти по ID,
затем req параметры блюдо ID, а затем блюдо».
И поэтому мы вернем комментарии к блюду здесь.
В противном случае, так что это другая часть.
Так что значит, что блюдо не существует.
Таким образом, в этом
случае мы построили ошибку здесь, сказав новые ошибки, а затем мы скажем,
блюдо req params идентификатор блюда не найден.
Так что это блюдо не было найдено,
поэтому, очевидно, мы не сможем вернуть комментарии к несуществующему блюду.
Таким образом, в этом случае
мы создадим новый объект ошибки, а затем
установим статус в объекте ошибки в 404.
Опять же, это 404 не найдено,
и тогда мы вернем следующую ошибку.
Итак, зачем мы это делаем?
Потому что, если вы вернете это как ошибку, как вы помните,
это будет обрабатываться вашим файлом app.js,
поэтому в файле app.js,
прямо внизу,
у нас есть обработчик ошибок здесь.
Поэтому, когда он приходит сюда,
это установит остальное или статус в статус точки ошибки,
который мы установили в 404,
так что это то, что будет возвращено,
а затем он просто примет эту ошибку, а затем отобразит эту ошибку здесь.
Таким образом, это позаботится о рендеринге ошибок.
Таким образом, это вернет сообщение об ошибке нашему клиенту.
Это то, что мы вызываем здесь,
поэтому, если блюдо не существует,
мы просто вернем эту ошибку здесь из операции get.
Теперь, для почты в случае поста,
мы ожидаем, что им будет
возвращен идентификатор блюда, а затем мы будем искать блюдо,
а затем мы возьмем набор комментариев
от тела, а затем положим его в блюдо там.
Так что мы скажем блюда, опять же, здесь,
нам придется делать находку по id, потому что мы ищем конкретное блюдо здесь.
Так что для поста, мы скажем, блюдо найти по ID, затем блюдо,
и поэтому внутри здесь,
если блюдо существует,
то мы будем обрабатывать блюдо соответствующим образом.
Если нет, то нам придется отправить сообщение об ошибке.
Так что позвольте мне скопировать эту часть из get, а затем,
мы заменим это здесь.
Итак, очевидно, если блюдо не существует,
то мы вернем эту ошибку здесь,
но если блюдо существует, в этом случае
мы вернем код состояния 200 set header.
Но прежде чем мы передадим значение,
то, что я собираюсь сделать, это сказать блюдо комментарии,
поэтому мы публикуем новый набор комментариев для блюда.
Так что мы скажем, комментарии к блюду толкать req тело.
Потому что тело сообщения содержит все комментарии, которые нужно нажать здесь,
а затем мы скажем: «Блюдо сохранить».
И поэтому, если сохранение возвращается успешно с блюдом здесь,
поэтому мы вышлем обновленное блюдо отсюда.
Так что эта часть, где мы создаем код состояния,
мы сделаем это внутри здесь, а затем мы отправим обратно
res.json и блюдо, которое мы получили здесь.
Итак, то, что мы делаем, это то, что мы берем блюдо здесь.
Сначала мы толкаем комментарии в блюдо,
новый набор комментариев в блюдо здесь,
а затем мы сохраняем обновленное блюдо здесь.
Затем после сохранения
мы собираемся вернуть обновленное блюдо обратно пользователю здесь.
Затем, если есть ошибка,
то мы будем обрабатывать ошибку так же, как мы сделали здесь.
Если блюдо не существует, конечно,
мы вернем ошибку, говоря, что блюдо не существует.
Итак, это для поста.
Операция PUT, конечно,
не поддерживается на блюдах.
Итак, в этом случае
мы пытаемся выполнить операцию PUT
на блюдах, req.params.dishid/comments.
Так что, это запрещено.
Итак, это то, что мы говорим для операции PUT.
Для операции удаления,
то, что мы сделаем, это сначала найти блюдо.
Итак, мы скажем «Dish.FindbyID».
Таким образом, удаление означает, что мы удаляем все комментарии из блюда, а
не само блюдо,
но мы удаляем все комментарии из блюда.
Итак, в этом случае,
то, что мы в конечном итоге делаем следующим образом: так что если блюдо не является нулевым,
помните, что мы должны справиться с этим, сказав затем блюдо.
Если блюдо не является нулевым,
то мы бы удалили все комментарии из блюда.
Итак, я собираюсь скопировать этот код, а затем вставить его сюда,
а затем мы отредактируем этот код, а затем удалим.
Посмотрим, не будет ли блюдо нулевым,
тогда они вернут блюдо сюда.
Таким образом, если блюдо не является
нулевым, wat мы бы обработали это следующим образом.
Таким образом, нам придется войти и удалить каждый из комментариев.
Итак, мы скажем для (var i =
(dish.comments.length -1) i>= 0; i—).
Итак, мы буквально входим и удаляем каждый комментарий.
Итак, скажем
dish.comments.id (dish.comments.id [i]. _id).
Мы скажем «удалить».
Итак, мы собираемся удалить каждую из посуды,
по одному под каждый из комментариев один за другим.
Так вот, что мы будем делать с комментариями.
Затем, как только мы удалили все комментарии к блюду,
то нам придется сохранить блюдо, а затем отправить обратно.
Итак, и раньше, когда мы модифицировали блюдо,
это то, что мы сделали здесь.
Итак, я собираюсь скопировать эту часть,
а затем зайти сюда,
а затем сказать dash.save,
тогда мы вернем блюдо
сюда, чтобы указать, что обновленное блюдо возвращается сюда.
Итак, вот как мы удалим комментарии.
Итак, здесь мы идем,
теперь нет простого способа буквально вытащить
все комментарии из массива, когда у вас есть поддокумент.
Таким образом, вы должны войти и удалить каждый вложенный документ один за другим.
Итак, это то, что я делаю в этом цикле здесь.
Итак, я говорю для (var i = dish.comments.length).
Итак, я смотрю на массив комментариев, а затем начиная с
последнего комментария в этом массиве до самого первого комментария,
я вхожу, а затем удаляю комментарий по комментарию здесь, используя
операцию удаления во вложенном документе.
Итак, способ, которым мы получим доступ к вложенному документу, заключается в том, что
блюдо, а затем комментарии - это имя поля, а затем я говорю id здесь.
Итак, вот как вы обращаетесь к вложенному документу,
и внутри здесь вы укажете идентификатор вложенных документов, к которым вы пытаетесь получить доступ.
Итак, все это даст вам доступ к вложенному документу,
а затем мы вызываем метод удаления на вложенном документе,
и таким образом вложенный документ будет удален из массива вложенных документов.
После этого, после того, как мы удалим все комментарии,
я сохраню изменения и все.
Итак, все мои комментарии будут удалены с того блюда.
Теперь мы будем иметь дело с следующей конечной точкой, которая является dishidcomments /:CommentID.
Итак, в этом случае
мы начнем сначала найти блюдо, а затем после того, как мы найдем блюдо,
тогда мы должны убедиться, что блюдо существует,
а затем разобраться с блюдом.
Итак, я собираюсь удалить эту часть,
а затем мы скажем, давайте скопируем эту часть из git, который у нас был ранее,
потому что нам нужно иметь возможность иметь дело с ситуацией,
когда либо блюдо не существует, либо блюдо существует, но комментариев не существует,
или само блюдо не существует.
Итак, есть три условия, которые мне нужно проверить.
Итак, мы скажем, если (блюдо! =
null && dish.comments.id (req.params.commentid)! =
null, так что это означает, что блюдо существует, а также комментарии существуют в блюде,
только тогда мы можем отправить обратно конкретный комментарий, который был запрошен.
Итак, в этом случае
мы скажем, что StatusCode - 200, приложение setHeader json,
а затем здесь мы отправим обратно dish.comments,
и мы отправляем обратно этот конкретный комментарий.
Таким образом, это конкретный комментарий, который мы отправляем max.
Таким образом, это позволит нам получить конкретный комментарий из набора комментариев.
Теперь мы скажем иначе, если блюдо равно нулю.
Таким образом, блюда нулевые,
то, конечно, нам придется указать, что блюдо не существует, и
последнее условие - если сам комментарий является нулевым.
Итак, в этом случае я также должен указать, что сам комментарий не существует,
этот конкретный идентификатор комментария не существует, поэтому в этом случае
я скажу, что новый
комментарий ошибки req.params.commentID не найден.
Итак, три условия.
Во-первых, вы должны убедиться, что сначала блюдо существует и блюдо комментарии существуют,
если они делают, то я могу отправить обратно конкретный комментарий,
если нет, если блюдо само не существует на стороне сервера в базе данных,
то я укажу, что блюдо не существует, но если
блюдо блюдо не существует существует, но комментарий не существует,
тогда я отправлю обратно сообщение о том, что комментарий не существует.
Итак, обратите внимание, что они должны обрабатывать все возможные условия здесь для GET.
Для POST, конечно,
операция после не поддерживается на этой конечной точке,
поэтому мы скажем
comments slash req.params.commentid.
Таким образом, операция POST не поддерживается в этом идентификаторе комментария. А что насчёт PUT?
PUT - более интересный случай здесь.
Итак, опять же, даже для пута,
я должен обрабатывать все эти возможные условия,
поэтому я собираюсь посмотреть на это и сказать, хорошо для этого,
позвольте мне скопировать весь этот код, потому что мы должны обрабатывать
все эти возможности, а затем я скажу вам, как мы обрабатываем дело PUT здесь.
Итак, в случае PUT,
сначала, конечно, нам нужно найти бойню.
Таким образом, они скажут, что блюда найти по Id req param Id,
тогда если блюдо существует и сам комментарий существует,
то я знаю, что могу обновить комментарий.
В противном случае, эти два условия, очевидно, должны быть приняты во внимание,
что комментарий не существует или блюдо не существует.
Эти двое уже разбираются в этом деле.
Вот особая ситуация, которая у нас есть.
Итак, если блюдо существует и конкретный комментарий, который я ищу, также существует,
то я знаю, что в теле сообщения
указано обновление для комментария.
Поэтому мне нужно обновить это.
Итак, где-то здесь я делаю модификации,
я делаю блюдо сохранить здесь,
поэтому я собираюсь войти и скопировать немного этого кода отсюда,
конечно, это не правильно, но мне просто нужна часть кода оттуда,
поэтому я войду в PUT.
Позвольте мне вставить его на место здесь, а
потом я расскажу вам, как именно они будут справляться с этим.
Потому что мне нужно блюдо сохранить часть.
Итак, как мы обрабатываем обновление для конкретного комментария?
Таким образом, для обновления конкретного комментария
мы знаем, что этот комментарий должен быть обновлен,
поэтому мы знаем, что блюдо существует и сам комментарий существует.
Я хочу обновить поля текущего.
Теперь, если комментарий уже существует, я не хочу,
чтобы пользователь мог изменить автора комментария,
автор должен сохранить.
Единственные два поля, которые я бы позволил пользователю обновить, это рейтинг.
Таким образом, в теле входящего сообщения PUT
я могу либо включить
обновленный рейтинг
, либо обновленный комментарий.
Это единственные две вещи, которые я позволю пользователю изменить.
Поэтому, если свойство рейтинга есть косвенное тело, чтобы вызвать, что тело
будет содержать обновление, которое мы пытаемся сделать это в этом случае мы скажем блюдо.
Итак, мы скажем комментарии к блюду,
так что позвольте мне просто скопировать эту часть.
Комментарий к блюдам ID.
Теперь это простой способ справиться с этой проблемой здесь.
Поскольку нет конкретного способа обновления
конкретного комментария, который находится в вложенном документе,
нет конкретного метода для этого.
Таким образом, это обходной путь, который я нашел, который, похоже, работает для нас,
поэтому мы скажем, блюдо comments req параметр comment Id рейтинг равен req body.rating.
Поэтому я обновлю рейтинг.
Аналогично, если комментарий существует,
то я скажу req comment Id comment req comment req body comment.
Так вот, как я буду обновлять рейтинг и комментарий,
и я однажды говорю об обновленном рейтинге и комментарии,
и они сохранят блюдо,
а потом как только я сохраню блюдо, то отправлю обратно ответ.
Итак, обратите внимание, что это единственный способ, которым я нашел, который достаточно
легко обновить встроенный вложенный документ внутри документа Mongoose.
Нет явного способа, который Mongoose поддерживает для обновления встроенного документа.
Таким образом, это обходной путь, который я нашел, который позволяет нам выполнить эту операцию.
Теперь для операции удаления.
Для операции удаления мы удаляем только специфический
комментарий, поэтому я возьму эту информацию из
deleter для
всех комментариев и вместо удаления всех комментариев
я собираюсь удалить только конкретный комментарий.
Итак, позвольте мне скопировать это из удаления.
Позвольте мне вставить его здесь, а затем мы обновим это.
Итак, если я удаляю конкретный комментарий, поэтому я сначала найду блюдо.
Если блюдо не является нулевым,
напомним, что в этой ситуации я должен обрабатывать как блюдо,
не являющееся нулевым, так и комментарий, не являющийся нулевым.
Итак, я скажу, если
блюдо не равно нулю, а параметр идентификатора комментариев блюдо не равен нулю,
тогда я знаю, что у меня есть конкретный комментарий, который я хочу удалить.
Я не удаляю все комментарии,
я удаляю только конкретный комментарий здесь.
Итак, я скажу идентификатор комментариев блюда, а затем я удаляю конкретный комментарий здесь, который
является req.params.commentid и удаляю
этот конкретный комментарий, а затем я сохраню обновленное блюдо, а затем перейду с этим.
Теперь, остальная часть мне нужно справиться с обеими ситуациями.
Итак, позвольте мне скопировать эту часть еще, если блюдо не равно нулю и
так далее, а затем заменить это здесь.
Итак, если блюдо нулевое, я отправлю обратно ошибку, говорящую, что блюдо не существует.
Если комментарий равен нулю, я отправлю обратно ошибку, говорящую, что комментарий не существует.
Вот и все,
это обновление, которое я делаю здесь.
Для удаления конкретного комментария
я сначала убедитесь, что блюдо и комментарий
существуют, затем я удалю конкретный комментарий, а затем я
сохраню изменения в блюде, а затем продолжаю
обработку остальных случаев, вот и все.
Давайте сохраним изменения, а затем посмотрим, как это работает.
Отправляясь на терминал,
я вижу, что сервер MongoDB не работает и работает, поэтому давайте начнем там.
Убедитесь, конечно,
что сервер MongoDB запущен и запущен,
давайте также запустим наш экспресс-сервер.
Как только ваш экспресс-сервер запущен и работает,
то, что мы будем делать, это теперь мы смотрим конкретно
на комментарии, а затем выполняем операции над комментариями.
Итак, давайте пойдем к почтальону, а
затем проверить, что у нас есть в базе данных, а затем попытаемся изменить комментарии.
Итак, вот я в Почтальоне,
так что позвольте мне сначала получить посуду, а теперь я вижу, что посуда пуста.
Так что позвольте мне разместить блюдо в списке блюд, так что позвольте мне опубликовать одно блюдо.
Напомним, что у нас есть это блюдо ей,
поэтому в моем почтальоне я уже делал это для предыдущего упражнения.
Я просто собираюсь выбрать это, а затем опубликовать это блюдо, а затем вы
увидите, что это конкретное блюдо было опубликовано здесь, внизу.
Вы можете видеть, что блюдо было создано прямо там.
Позвольте мне теперь скопировать этот конкретный идентификатор блюда, а затем я собираюсь
получить это блюдо здесь.
Итак, вы видите, что это блюдо существует здесь.
Сначала давайте получим все комментарии.
Итак, если я сделаю получить комментарии, вы заметите, что
все комментарии для этого конкретного блюда были возвращены.
Мы можем сделать сообщение и удаление также.
Давайте сделаем это, и, очевидно, вы не можете сделать надеть
назад, чтобы вы заметили, что операция ввода не работает на этом.
Давайте оставим новый комментарий.
Поэтому, чтобы опубликовать новый комментарий, мы войдем в тело,
а затем позвольте мне вырезать все это, а затем мы отредактируем один из
комментариев, а затем
попытаемся опубликовать этот комментарий.
Итак, мы скажем рейтинг три, а затем мы
скажем тест комментарий, тестовый пользователь.
Давайте оставим этот комментарий.
Когда вы публикуете этот комментарий,
вы видите, что блюдо обновления было возвращено здесь, и вы видите, что в
этом блюде вы видите, что новый комментарий был включен там.
Итак, давайте скопируем все это.
Теперь мы попытаемся получить тот конкретный комментарий, который мы только что вставили.
Для этого конкретного комментария это идентификатор этого комментария.
Поэтому позвольте мне скопировать идентификатор для этого конкретного комментария.
Возвращаясь к Почтальону,
позвольте мне попытаться получить этот конкретный комментарий, выполнив операцию get.
Там вы видите, что этот конкретный комментарий был извлечен здесь.
Теперь, если вы пытаетесь сделать сообщение об этом, это не сработает,
так очевидно, что вы видите, что послеоперационная операция не разрешена на этом.
Давайте сделаем операцию put,
на этом конкретном комментарии.
Итак, если я должен был поместить операцию в тело,
я собираюсь сказать обновленный комментарий к тесту.
Итак, я собираюсь обновить поле комментария этого комментария.
Если вы говорите, чтобы надеть это, вы увидите, что для конкретного комментария,
комментарий был обновлен, чтобы отразить обновленный тестовый комментарий.
Таким образом, вы видите, что операция ввода в поле комментариев также работает правильно.
Давайте удалим этот комментарий,
чтобы я мог удалить комментарий, а затем, когда я удалю комментарий, вы
увидите, что этот комментарий исчез из списка комментариев.
Таким образом, вы видите, что операция удаления также работает.
Удалим все комментарии.
Поэтому я собираюсь войти и удалить все комментарии.
Затем вы видите, что все комментарии были удалены,
и вы видите, что область комментариев теперь пуста.
Итак, теперь вы можете видеть все
операции get, put, post и
delete на
диске/dishid/commentID,
REST API работают так, как ожидалось.
Таким образом, мы завершаем это упражнение.
Таким образом, в этом упражнении мы завершили реализацию косой черты блюд,
REST API конечной точки и поддерживали весь путь до того,
чтобы позволить нам манипулировать одним блюдом,
коллекцией блюд,
одним комментарием, а также сборкой комментариев.
Это хорошее время для вас сделать git commit с сообщением,
express, REST API с Mongoose часть вторая.