Статьи

Сохранение списка Todo с MongoDB и Geddy

В этом уроке из трех частей мы углубимся в создание приложения для управления списками дел в Node.js и Geddy . Это последняя запись в серии, где мы будем сохранять наши элементы todo в MongoDB.

Для быстрого обновления в прошлый раз мы создали наш ресурс todo и создали приложение для работы со списком работ, но данные существовали только в памяти. В этом уроке мы исправим это!


MongoDB — это база данных хранилища документов NoSQL, созданная людьми в 10gen. Это отличная база данных для приложений Node, потому что она хранит свои данные уже в JSON-подобном формате, а ее запросы написаны на JavaScript. Мы будем использовать его для нашего приложения, поэтому давайте настроим его.

Перейдите по адресу http://www.mongodb.org/downloads и загрузите последнюю версию для вашей ОС. Следуйте инструкциям в readme оттуда. Удостоверьтесь, что вы можете запустить mongod (и продолжайте и оставьте его mongod на время этого урока)

Стоит отметить, что вам понадобится запускать Монго в любое время, когда вы хотите, чтобы ваше приложение работало. Большинство людей настраивают это, чтобы запускать со своего сервера, используя сценарий запуска или что-то в этом роде.

Выполнено? Хорошо, давайте двигаться дальше.

Для нашего приложения мы будем использовать модуль, который обёртывает драйвер базы данных mongodb. Это значительно упрощает код, который мы будем создавать, поэтому давайте его установим. Перейдите в ваше приложение и выполните эту команду:

1
npm install mongodb-wrapper

Если все идет хорошо, у вас должен быть mongodb-wrapper в вашем node_modules .


Mongo — это действительно простая БД для работы; Вам не нужно беспокоиться о настройке таблиц, столбцов или баз данных. Просто подключившись к базе данных, вы создаете ее! И просто добавляя в коллекцию, вы делаете один. Итак, давайте настроим это для нашего приложения.

Нам понадобится доступ ко всей нашей config/init.js , поэтому давайте config/init.js наш код в config/init.js Откройте это; это должно выглядеть так:

Давайте добавим наш код базы данных в самом верху (и удалим массив geddy.todos, пока мы на нем):

Во-первых, нам требуется модуль mongodb-wrapper . Затем мы настраиваем нашу базу данных и добавляем в нее коллекцию. Вряд ли какая-либо настройка вообще.


Гедди на самом деле все равно, какой бэкэнд данных вы используете, если для него написан адаптер модели. Это означает, что единственный код, который вам придется изменить в своем приложении, чтобы todo свои todo в базу данных, находится в адаптере модели. Тем не менее, это будет полная перезапись адаптера, поэтому, если вы хотите сохранить старое приложение в памяти, вам нужно скопировать код в другой каталог.

Откройте свой модель-адаптер ( lib/model_adapters/todo.js ) и найдите метод save . Это должно выглядеть примерно так:

Сделайте так, чтобы это выглядело так:

Не слишком пугайтесь этого; Сначала мы начали с самого сложного. Помните, что наш метод save должен учитывать как новые todo и обновление старых todo . Итак, давайте пройдемся по этому коду шаг за шагом.

Мы используем тот же код обратного вызова, что и раньше — если нам не передан обратный вызов, просто используйте пустую функцию.

Затем мы продезинфицируем наш предмет todo . Мы должны сделать это, потому что наш объект todo имеет методы JavaScript (например, save ), и Mongo не нравится, когда вы передаете ему объекты с методами. Таким образом, мы просто создаем новый объект только с теми свойствами, которые нам нужны.

Затем мы проверяем, является ли todo действительной. Если это не так, мы вызываем обратный вызов с ошибками проверки. Если это так, мы продолжим.

В случае, если у нас уже есть этот элемент todo в БД, мы проверяем его, чтобы увидеть, существует ли todo . Здесь мы начинаем использовать модуль mongodb-wrapper . Это дает нам чистый API для работы с нашей базой данных. Здесь мы используем метод db.todos.findOne() чтобы найти один документ, который соответствует нашему запросу. Наш запрос представляет собой простой объект js — мы ищем документ, id которого совпадает с id нашей todo . Если мы находим его и ошибки нет, мы используем метод db.todos.update() для обновления документа новыми данными. Если мы не найдем его, мы используем метод db.todos.save() для сохранения нового документа с данными элемента todo .

Во всех случаях мы вызываем обратный вызов, когда все готово, с любыми ошибками, которые мы получили, и документами, которые нам возвращала БД, передают на него.

Взгляните на метод all , он должен выглядеть так:

Давайте сделаем так:

Намного проще, чем метод save ? Мы используем метод db.todos.find() чтобы получить все элементы коллекции todos . Мы используем monogdb-wrapper для sort результатов по status (в алфавитном порядке по sort ) и по title (в алфавитном порядке по возрастанию). Затем мы отправляем это в массив, который запускает запрос для запуска. Как только мы вернем наши данные, мы проверяем, есть ли какие-либо ошибки, если они есть, мы вызываем обратный вызов с ошибкой. Если ошибок нет, мы продолжаем.

Затем мы перебираем все docs (документы, которые Монго вернул нам), создаем новые экземпляры модели todo для каждого из них и помещаем их в массив todos . Когда мы закончим, мы вызываем колбэк, передавая todos .

Взгляните на метод load, он должен выглядеть примерно так:

Давайте сделаем так:

Этот еще проще. Мы снова используем метод db.todos.findOne() . На этот раз это все, что мы должны использовать. Если у нас есть ошибка, мы вызываем ее с помощью функции обратного вызова, если нет, мы продолжаем (см. Образец здесь еще?). Если у нас есть документ, мы создаем новый экземпляр модели todo и вызываем с ним функцию обратного вызова. Вот и все.

Посмотрите на метод remove сейчас, он должен выглядеть так:

Давайте сделаем так:

Метод удаления даже короче, чем раньше. Мы используем метод db.todos.remove() для удаления любых документов с переданным id и вызываем обратный вызов с ошибкой (если есть).


Давайте протестируем наше приложение: cd в каталог вашего проекта и запустите сервер с помощью geddy . Создать новую todo . Попробуйте отредактировать его, пропустите некоторые проверки и попробуйте удалить его. Все работает!


Надеюсь, вам понравилось изучать Node.js, MongoDB и особенно Geddy. Я уверен, что к настоящему времени у вас есть миллион идей о том, что вы могли бы построить с этим, и я хотел бы услышать о них. Как всегда, если у вас есть какие-либо вопросы, оставьте комментарий здесь или откройте вопрос на github .