Express js быстрый сервер. Основы Node JS & Express (III)

Начало работы с Express

Последнее обновление: 18.11.2018

В этой главе мы рассмотрим создание сервера с помощью фреймворка Express . Казалось бы, зачем нам нужен дополнительный фреймворк, если мы можем воспользоваться готовым модулем http, который есть в Node.js API. Однако Express сам использует модуль http, но вместе с тем предоставляет ряд готовых абстракций, которые упрощают создание сервера и серверной логики, в частности, обработка отправленных форм, работа с куками, CORS и т.д.

Создадим для проекта новый каталог, который назовем, к примеру, expressapp . Для хранения информации обо всех зависимостях проекта определим в этом каталоге новый файл package.json :

{ "name": "expressapp", "version": "1.0.0", "dependencies": { "express": "^4.16.4" } }

Создадим в каталоге проекта новый файл app.js :

// подключение express const express = require("express"); // создаем объект приложения const app = express(); // определяем обработчик для маршрута "/" app.get("/", function(request, response){ // отправляем ответ response.send("

Привет Express!

"); }); // начинаем прослушивать подключения на 3000 порту app.listen(3000);

Для использования Express в начале надо создать объект, который будет представлять приложение:

Const app = express();

Для обработки запросов в Express определено ряд встроенных функций, и одной из таких является функция app.get() . Она обрабатывает GET-запросы протокола HTTP и позволяет связать маршруты с определенными обработчиками. Для этого первым параметром передается маршрут, а вторым - обработчик, который будет вызываться, если запрос к серверу соответствует данному маршруту:

App.get("/", function(request, response){ // отправляем ответ response.send("

Привет Express!

"); });

Маршрут "/" представляет корневой маршрут.

Для запуска сервера вызывается метод app.listen() , в который передается номер порта.

Запустим проект и обратимся в браузере по адресу http://localhost:3000/ :

И что важно, Express опирается на систему маршрутов, поэтому все другие запросы, которые не соответствуют корневому маршруту "/", не будут обрабатываться:

Теперь изменим файл app.js :

Const express = require("express"); const app = express(); app.get("/", function(request, response){ response.send("

Главная страница

"); }); app.get("/about", function(request, response){ response.send("

О сайте

"); }); app.get("/contact", function(request, response){ response.send("

Контакты

"); }); app.listen(3000);

Теперь в приложении определено три маршрута, которые будут обрабатываться сервером.

Как видно из заголовка, речь в нашей статье пойдет о выборе одного из трех фреймворков для Node.js: Express , Koa и Sails .

В конце статьи мы поделимся с вами выбором компании и объясним, почему выбранному нами фреймворку стоит уделить особое внимание.

Сразу подчеркнем, что задача достаточно сложная, и провозгласить один из вариантов как оптимальный и подходящий на все случаи жизни будет сложно.

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

А сейчас давайте перенесемся в 2009г. , когда двухлетние эксперименты Райана Даля по созданию серверных веб-компонентов увенчались успехом и появилась принципиально новая технология.

Node.js событийно-ориентированная платформа, применяемая для создания веб-приложений, которая обеспечивает возможность использовать JavaScript на стороне сервера.

Так как до появления Node.js язык JavaScript использовался только на стороне клиента, появление такой платформы было встречено разработчиками с энтузиазмом. По сути, это открывало новые возможности для создания приложений с высокой производительностью и масштабируемостью.

Нужно признать, что ожидания разработчиков оправдались, и на данный момент Node.js сохраняет популярность и продолжает двигаться вперед.

Чтобы убедиться в этом, достаточно отследить периодичность выхода обновлений и объем вносимых изменений .

Сообщество Node.js растет и развивается. Регулярно генерируются новые идеи, а в результате появляются новые инструменты и библиотеки.

Благодаря таким темпам развития разработчики получили в свое распоряжение широкий ассортимент фреймворков, а подобное многообразие, как правило, предполагает сложный выбор.

В своей с татье мы будем выбирать один из трех MVC фреймворков, которые используются для серверной части (бэкенда) приложений на Node.js.

MVC (англ. Model-View-Controller) шаблон проектирования, включающий в себя три компонента: Модель, Представление и Контроллер. Изменение всех трех компонентов может производиться независимо друг от друга. При этом модель предоставляет данные и правила управляющей логики, представление отвечает за отображение данных на пользовательском интерфейсе, а контроллер обеспечивает взаимодействие между моделью и представлением.

Для сравнения в рамках этой статьи м ы выбрали:

  • Express, как самый гибкий, простой и быстрый фреймворк
  • Koa , как версию Express нового поколения, созданную той же командой разработчиков
  • Sails , как созданный для быстрой разработки приложений на принципах Ruby on Rails и Express .

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

Но при этом все три варианта обладают определенными характеристиками и особенностями, обеспечивающими преимущество в той или иной конкретной ситу ации.

EXPRESS.JS

Начнем описание с самого простого фреймворка, используемого на платформе Node.js.

Express используется для разработки приложений достаточно давно и благодаря своей стабильности прочно занимает позицию одного из самых

Для этого фреймворка существует большое количество подробных инструкции и описаний, которые составлены разработчиками, проверившими его эффективность на практике. Поэтому именно с Express рекомендуется начинать работу, если вы намерены научиться создавать приложения на платформе Node.js.

Согласитесь, гораздо разумнее воспользоваться накопленным и проверенным опытом, чем заново изобретать велосипед.

Основная особенность этого фреймворка заключается в том, что для Express характерен небольшой объем базового функционала . Все остальные нужные вам функции нужно будет добирать за счет внешних модулей. По сути, Express в чистом виде – это сервер и у него может не быть ни одного модуля.

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

При этом немаловажно, что выбор модулей для Express не связан ни с какими ограничениями: ни с количественными, ни с функциональными.

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

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

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

ПЛЮСЫ:

✓ простота

✓ гибкость

✓ хорошая масштабируемость

✓ развитое сообщество

✓ подробная документация

✓ широкий выбор подключаемых модулей

МИНУСЫ:

✗ большой объем ручной работы

✗ используется устаревший подход callbacks функций

KOA.JS

Koa был создан командой разработчиков, как вариант фреймворка Express в новом поколении . Такая улучшенная версия разрабатывалась для создания веб-приложений и API с повышенной производительностью. Соответственно, создатели стремились учесть все недостатки предшественника и сделать его более современным и удобным в использовании.

Посмотрим, насколько это удалось.

Koa обладает практически таким же функционалом и превосходит Express по легкости.

Характерной особенностью Koa является использование генераторов ES6.

Генераторы – тип функций, которые могут быть запущены, остановлены и возобновлены независимо от того, на каком этапе выполнения они находятся, и при этом сохраняют свой контент.

Применение генераторов ES6 в Koa позволяет исключить обратные вызовы (англ. callbacks ), уменьшает для разработчиков объем работы с кодом и снижает вероятность ошибок .

Благодаря тому, что создателями Koa уже были учтены минусы, выявленные в процессе работы с Express , этот фреймворк может похвастаться тем, что его применение существенно упрощает адаптацию под конкретные запросы клиентов (кастомизацию ). А такая характеристика может в итоге сыграть решающую роль в процессе выбора: сегодня в условиях высокой конкуренции любое приложение стремится к использованию своего собственного стиля.

Если говорить о недостатках, они, в основном, связаны с относительной молодостью Koa (появился в 2013 г. ). Фреймворк не пользуется поддержкой такого обширного сообщества, как Express , и еще не успел продемонстрировать все свои возможности.

ПЛЮСЫ:

✓ легкий

✓ гибкий

✓ быстрый

✓ генераторы ES6

✓ лучшая кастомизация

МИНУСЫ:

✗ недостаточная поддержка сообщества

SAILS.JS

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

Соответственно, такой фреймворк изначально будет тяжелее, чем два предыдущих.

С одной стороны, от разработчика требуется минимальное количество усилий, так как для создания приложения используется собственный функционал фреймворка. Нет необходимости вникать в тонкости процесса – можно просто взять готовое проверенное решение.

С другой стороны, разработка приложения будет ограничена рамками имеющихся в наличии средств фреймворка, так как внешних модулей для Sails гораздо меньше, чем для Express или Koa .

Отличительной особенностью фреймворка является встроенная технология программирования Waterline ORM (англ. Object-Relational Mapping) , которая используется для обеспечения связи с различными базами данных.

Наличие такого компонента можно было бы отнести к преимуществам, но в процессе работы вы можете столкнуться с определенными ограничениями. Например, Waterline не поддерживает транзакции, новые фичи и исправления ошибок вносятся несвоевременно.

В целом, более медленное развитие до недавнего времени было характерно для всего сообщества Sails , особенно по сравнению с другими, поддерживающими описанные выше Express и Koa . Но следует отметить, что на данный момент сообщество Sails все же начало набирать обороты и развиваться более активно.

ПЛЮСЫ:

✓ богатый функционал

✓ поддержка Socket.io

✓ документация в одном месте

✓ легче найти специалиста с опытом работы на Sails

МИНУСЫ:

✗ тяжелый

✗ медленный

✗ ограничения Waterline

✗ недостаточно подробная документация

Мы описали основные свойства, характерные для трех фреймворков, которых вполне достаточно для составления о них объективного впечатления.

Если у вас остались вопросы, свяжитесь с нами прямо сейчас!

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

Попробуем сделать общий вывод из того, что мы уже знаем о трех рассматриваемых фреймворках. Определим для каких проектов, в целом, лучше подходит каждый из них:

Express.js подходит для:

  • начинающих программистов, которые нацелены на профессиональный рост в Node JS;
  • больших проектов, предполагающих кастомизацию;
  • случаев, когда необходима долгосрочная поддержка приложения.

Sails.js подходит для:

  • быстрого старта проекта;
  • быстрых стартапов, которые не предполагают расширения в будущем;
  • приложений реального времени, где требуется моментальная реакция;
  • начинающих Node.js программистов;
  • приложений, не требующих долгосрочной поддержки.

Справедливости ради отметим, что приложения реального времени можно создавать и при помощи Express. Однако при разработке такого приложения с использованием Sails на создание и настройку уйдет гораздо меньше времени и сил.

Koa.js подходит для:

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

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

Мы выбираем Koа, потому что:

  • Как и Express, Koa не ограничивает разработчика в использовании встроенных модулей, а дает возможность выбрать из множества именно тот, который подходит лучше всего для конкретного проекта;
  • Koa вобрал в себя достоинства проверенного и широко-используемого фреймворка Express;
  • у создателей Koa была возможность проанализировать сложности, с которыми столкнулись разработчики, использовавшие Express;
  • при создании Koa были учтены недостатки его предшественника;
  • Koa основан на новых стандартах и соответствует современным тенденциям;
  • Koa подходит для разработки самых разнообразных приложений любого объема, с любой степенью кастомизации и с любыми требованиями к поддержке;

… и самый главный аргумент – это собственный положительный опыт специалистов , приобретенный во время работы с этим фреймворком.

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

Мы всегда готовы поддержать ваш выбор и помочь вам реализовать любой проект. Не откладывайте на завтра и прямо сейчас!

Глядя на шаблон синтаксиса, если мы хотим добавить новый маршрут в приложение, то можем просто сделать что-то вроде следующего:

Router.get("/app", function(req, res) { res.render("app", { title: "Express" }); });

Это маршрут? Это контроллер?

Самое интересное что маршрут это функция, содержащая логику. Внутри маршрута находится функция res.render:

Res.render("foo", { title: "Express" });

В шаблоне представления мы видим это:

H1= title p Добро пожаловать в #{title}

Это два примера того, как мы можем вытащить данные из controller/route и вывести их в представлении. В этом примере мы выводим HTML:

Express

Добро пожаловать в Express

Всё это, кажется, вытекает из проблемы - может ли маршрут также содержать информацию контроллера? Это верно, поэтому есть движение в обществе за то, чтобы изменить имя папки с routes на controllers.

Отличный пример этого можно увидеть в примере Express MVC .

Но ради логичности в этом руководстве мы будем держаться текущих соглашений.

Ошибки 404

Ошибки уже направляют вас в Express. В файле app.js есть следующее:

/// поймать 404 и перенаправить в обработчик ошибки app.use(function(req, res, next) { var err = new Error("Не найдено"); err.status = 404; next(err); });

В папке views/ есть errors.jade.

Extends layout block content h1= message h2= error.status pre #{error.stack}

Всё просто. Если вы хотите настроить свою страницу 404, то всего-лишь редактируйте это представление.

  • Перевод

Начинающему программисту разработка для Node.js может показаться сущим кошмаром. Виной всему – гибкость этой платформы и отсутствие чётких руководств. Но, на самом деле, всё не так уж и страшно.


Вот, например, типичная задача: разработка REST API, серверной части некоего приложения. Обилие собственных возможностей Node и множество дополнительных модулей, которые способны помочь в решении этой задачи, способны завести новичка в тупик, вызванный богатством выбора. Основные вопросы здесь заключаются в подборе компонентов и в настройке их совместной работы.

Один из способов создания серверной части приложения заключается в применении связки из Node.js, фреймворка Express и СУБД MongoDB. Собственно говоря, сегодня я расскажу о том, как создать рабочий макет API, который может служить основой для практически любого приложения. Здесь мы реализуем основные маршруты REST, будем взаимодействовать с API по HTTP и использовать простые варианты работы с базой данных.

Для того, чтобы успешно освоить этот материал, вам надо понимать, что такое REST API, иметь представление об операциях CRUD и обладать базовыми знаниями в области JavaScript. Здесь я использую ES6, ничего особенно сложного, в основном – стрелочные функции.

Мы разработаем скелет серверной части приложения для создания заметок, похожего на Google Keep . При этом с заметками можно будет выполнять все четыре CRUD-действия, а именно – создание (create), чтение (read), обновление (update), и удаление (delete).

Предварительная подготовка

Если Node у вас пока нет, самое время его установить . После установки создайте папку и выполните в ней команду инициализации нового проекта:

Npm init
В ходе инициализации ответьте на вопросы, в частности, дайте приложению имя «notable» (или, если хотите, любое другое).

Теперь в папке должен появиться файл package.json . Это означает, что можно начать устанавливать дополнительные пакеты, от которых зависит проект.

В качестве фреймворка мы планируем использовать Express. Системой управления базами данных будет MongoDB. Кроме того, в качестве вспомогательного средства для работы с JSON, используем пакет body-parser. Установим всё это:

Npm install --save express mongodb body-parser
Ещё, я очень рекомендую установить Nodemon как dev-зависимость. Это простой маленький пакет, который, при изменении файлов, автоматически перезапускает сервер.

Для установки этого пакета выполните команду:

Npm install --save-dev nodemon
Затем можно добавить следующий скрипт в файл package.json :

// package.json "scripts": { "dev": "nodemon server.js" },
Готовый package.json будет выглядеть примерно так:

// package.json { "name": "notable", "version": "1.0.0", "description": "", "main": "server.js", "scripts": { "dev": "nodemon server.js" }, "author": "", "license": "ISC", "dependencies": { "body-parser": "^1.15.2", "express": "^4.14.0", "mongodb": "^2.2.16" }, "devDependencies": { "nodemon": "^1.11.0" } }
Теперь создадим файл server.js и приступим к работе над API.

Сервер

Начнём с подключения зависимостей в файле server.js .

// server.js const express = require("express"); const MongoClient = require("mongodb").MongoClient; const bodyParser = require("body-parser"); const app = express();
MongoClient будем использовать для взаимодействия с базой данных. Кроме того, здесь мы инициализируем константу app , символизирующую наше приложение, экземпляром фреймворка Express. Чтобы сервер заработал, осталось лишь указать приложению на то, чтобы оно начало прослушивать HTTP-запросы.

Тут укажем порт и запустим прослушивание следующим образом:

// server.js const port = 8000; app.listen(port, () =>
Теперь, если выполнить команду npm run dev (или – node server.js , если вы не устанавливали Nodemon), в терминале должно появиться сообщение: «We are live on port 8000».

Итак, сервер работает. Но сейчас он не делает совершенно ничего полезного. Давайте с этим разберёмся.

Маршруты, ориентированные на CRUD-операции

Мы планируем создать 4 маршрута. А именно:
  • CREATE – создание заметок.
  • READ –чтение заметок.
  • UPDATE –обновление заметок.
  • DELETE –удаление заметок.
Освоив эту схему, вы сможете понять, как, с помощью Node, организовать практически любой необходимый REST-маршрут.

Для того, чтобы протестировать API, понадобится нечто, способное имитировать запросы клиентской части приложения. Решить эту задачу нам поможет отличная программа, которая называется Postman . Она позволяет выполнять простые HTTP-запросы с заданным телом и параметрами.

Установите Postman. Теперь всё готово к настройке маршрутов.

О структуре проекта

В большинстве руководств по Node.js (и во множестве реальных приложений) все маршруты размещают в одном большом файле route.js . Мне такой подход не очень нравится. Если разложить файлы по разным папкам, это улучшит читаемость кода, приложением будет легче управлять.

Наше приложение большим не назовёшь, но предлагаю сделать всё как надо, учитывая, всё же, его скромные масштабы. Создайте следующие папки: папку app , а внутри неё – routes . В папке routes создайте файлы index.js и note_routes.js . Другими словами, структура проекта будет выглядеть так: root > app > routes > index.js и note_routes.js .

Mkdir app cd app mkdir routes cd routes touch index.js touch note_routes.js
Такая структура, для маленького приложения, может показаться избыточной, но она окажется очень кстати в более крупной системе, построенной на базе нашего примера. К тому же, любые проекты лучше всего начинать, используя лучшие из существующих наработок.

Создание заметок: маршрут CREATE

Начнём с маршрута CREATE. Для этого ответим на вопрос: «Как создать заметку?».
Прежде чем приступить к созданию заметок, нам понадобится расширить инфраструктуру приложения. В Express маршруты оборачивают в функцию, которая принимает экземпляр Express и базу данных как аргументы.

Выглядеть это может так:

// routes/note_routes.js module.exports = function(app, db) { };
Теперь можно экспортировать эту функцию через index.js :

// routes/index.js const noteRoutes = require("./note_routes"); module.exports = function(app, db) { noteRoutes(app, db); // Тут, позже, будут и другие обработчики маршрутов };
Импортируем то, что получилось, в server.js :

// server.js const express = require("express"); const MongoClient = require("mongodb").MongoClient; const bodyParser = require("body-parser"); const app = express(); const port = 8000; require("./app/routes")(app, {}); app.listen(port, () => { console.log("We are live on " + port); });
Обратите внимание на то, что так как базу данных мы пока не настроили, вторым аргументом передаётся пустой объект.

Теперь создаём маршрут CREATE. Синтаксис здесь довольно простой:

Module.exports = function(app, db) { app.post("/notes", (req, res) => { // Здесь будем создавать заметку. res.send("Hello") }); };
Когда приложение получает POST-запрос по пути ‘/notes’, оно исполнит код внутри функции обратного вызова, передав ей объект запроса (который содержит параметры запроса или JSON-данные) и объект ответа (который, понятно, используется для ответа).

То, что у нас получилось, уже можно протестировать. Отправим, с помощью Postman, POST-запрос по адресу localhost:8000/notes .


В ответ на запрос должно прийти «Hello»

Отлично. Первый маршрут создан. Следующий шаг – добавление к запросу параметров, обработка их в API, и, наконец – сохранение заметки в базе данных.

Параметры запроса

В Postman перейдите на вкладку Body и добавьте несколько пар ключ-значение, выбрав радиокнопку x-www-form-urlencoded . А именно, первым ключом будет title , его значение – My Note Title . Второй ключ – body , его значение – What a great note .

Это добавит к запросу закодированные данные, которые можно будет обработать в API.


Заголовок моей заметки, да и она сама – очень просты, а вы тут можете проявить фантазию

В файле note_route.js , просто выведем тело заметки в консоль.

// note_routes.js module.exports = function(app, db) { app.post("/notes", (req, res) => { console.log(req.body) res.send("Hello") }); };
Попробуйте отправить запрос с помощью Postman, и вы увидите… undefined .

К сожалению, Express не может самостоятельно обрабатывать формы в URL-кодировке. Тут нам на помощь придёт ранее установленный пакет body-parser.

// server.js const express = require("express"); const MongoClient = require("mongodb").MongoClient; const bodyParser = require("body-parser"); const app = express(); const port = 8000; app.use(bodyParser.urlencoded({ extended: true })); require("./app/routes")(app, {}); app.listen(port, () => { console.log("We are live on " + port); });
Теперь, после выполнения POST-запроса, его тело можно будет увидеть в терминале в виде объекта.

{ title: "My Note Title", body: "What a great note." }
Чтобы первый маршрут полностью заработал, осталось лишь настроить базу данных и добавить в неё заметку.

Для быстрого создания и настройки базы данных воспользуемся сервисом mLab . Работать с ним легко, для маленьких объёмов информации он бесплатен.

Создайте учётную запись на сайте mLab и разверните новую базу данных MongoDB. Для этого нажмите на кнопку Create New в разделе MongoDB Deployments , в появившемся окне, в разделе Plan , выберите Single-node . В списке Standard Line , выберите Sandbox и дайте базе данных имя. Далее, в окне управления базой, перейдите на вкладку Users и добавьте пользователя базы данных, задав имя и пароль.


Новый пользователь базы данных

Скопируйте с той же страницы второй URL – строку подключения к базе данных.


URL для подключения к базе данных

В корень проекта добавьте директорию config , создайте в ней файл db.js .

Mkdir config cd config touch db.js
В файл db.js добавьте следующее:

Module.exports = { url: здесь будет ваш URL };
Не забудьте добавить в URL имя пользователя и пароль (не те, что от учётной записи в mLab, а те, что создавали для базы данных). Если вы размещаете проект на Github, не забудьте включить в него файл .gitignore (вроде этого). Так вы не сделаете всеобщим достоянием имя и пароль для работы с базой.

Теперь, в server.js , можно использовать MongoClient для подключения к базе данных и обернуть в функцию, которая передаётся ему при создании, настройки приложения:

// server.js const express = require("express"); const MongoClient = require("mongodb").MongoClient; const bodyParser = require("body-parser"); const db = require("./config/db"); const app = express(); const port = 8000; app.use(bodyParser.urlencoded({ extended: true })); MongoClient.connect(db.url, (err, database) => { if (err) return console.log(err) require("./app/routes")(app, database); app.listen(port, () => { console.log("We are live on " + port); }); })
На этом подготовка инфраструктуры закончена. С этого момента будем заниматься исключительно путями.

Добавление записей в базу данных

MongoDB хранит данные в коллекциях (collections), которые полностью оправдывают своё название. В нашем случае заметки будут храниться в коллекции, которая, как несложно догадаться, будет называться notes .

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

Db.collection("notes")
Создание заметки в базе равносильно вызову команды insert для коллекции notes:

Const note = { text: req.body.body, title: req.body.title} db.collection("notes").insert(note, (err, results) => { }
После успешного завершения команды (или после того, как она, по какой-нибудь причине, не сможет выполниться), нужно либо отправить в ответ только что созданный объект заметки, либо – сообщение об ошибке. Вот код note_routes.js , дополненный с учётом этих рассуждений:

// note_routes.js module.exports = function(app, db) { app.post("/notes", (req, res) => { const note = { text: req.body.body, title: req.body.title }; db.collection("notes").insert(note, (err, result) =>
Испытайте то, что получилось. Отправьте из Postman POST-запрос (с флагом x-www-form-urlencoded ), задав на вкладке Body значения полей title и body .

Ответ должен выглядеть примерно так:


Успешное добавление записи в базу

Чтение заметок: маршрут READ

Инфраструктура, которую мы подготовили выше, подходит для всех маршрутов, поэтому теперь дело пойдёт быстрее.

Итак, мы собираемся запросить только что созданную заметку, пройдя по пути localhost:8000/notes/{id заметки} . В нашем случае путь будет выглядеть так: localhost:8000/notes/585182bd42ac5b07a9755ea3 .

Если ID одной из уже созданных заметок у вас нет, можете заглянуть в базу на mLab и найти его там, или создать новую заметку и скопировать её идентификатор.

Вот как это выглядит в note_route.js :

// note_routes.js module.exports = function(app, db) { app.get("/notes/:id", (req, res) => { }); app.post("/notes", (req, res) => { const note = { text: req.body.body, title: req.body.title }; db.collection("notes").insert(note, (err, result) => { if (err) { res.send({ "error": "An error has occurred" }); } else { res.send(result.ops); } }); }); };
Так же, как и раньше, мы собираемся вызвать некую команду для коллекции базы данных заметок. Применим для этого метод findOne .

// note_routes.js module.exports = function(app, db) { app.get("/notes/:id", (req, res) => { const details = { "_id": <ТУТ БУДЕТ ID> }; db.collection("notes").findOne(details, (err, item) => { if (err) { res.send({"error":"An error has occurred"}); } else { res.send(item); } }); }); app.post("/notes", (req, res) => { const note = { text: req.body.body, title: req.body.title }; db.collection("notes").insert(note, (err, result) => { if (err) { res.send({ "error": "An error has occurred" }); } else { res.send(result.ops); } }); }); };
Идентификатор из параметров URL можно вытащить с помощью конструкции req.params.id . Однако если просто вставить строку вместо <<>> из кода выше, работать это не будет.

MongoDB требуется ID не в виде строки, а в виде специального объекта. Он называется ObjectID .

Вот что, после небольших изменений, у нас получилось:

// note_routes.js var ObjectID = require("mongodb").ObjectID; module.exports = function(app, db) { app.get("/notes/:id", (req, res) => { const id = req.params.id; const details = { "_id": new ObjectID(id) }; db.collection("notes").findOne(details, (err, item) => { if (err) { res.send({"error":"An error has occurred"}); } else { res.send(item); } }); }); app.post("/notes", (req, res) => { const note = { text: req.body.body, title: req.body.title }; db.collection("notes").insert(note, (err, result) => { if (err) { res.send({ "error": "An error has occurred" }); } else { res.send(result.ops); } }); }); };
Испытайте это с одним из идентификаторов заметок, имеющихся в базе данных. Ответ в Postman должен выглядеть так:


Успешный запрос заметки из базы

Удаление заметок: маршрут DELETE

Удаление объектов – это практически то же самое, что их поиск в базе. Только вместо функции findOne используется функция remove . Вот полный код соответствующего пути. Здесь выделено то, что отличается от кода уже существующего метода, обрабатывающего запрос GET.

// note_routes.js // ... app.delete("/notes/:id", (req, res) => { const id = req.params.id; const details = { "_id": new ObjectID(id) }; db.collection("notes").remove(details, (err, item) => { if (err) { res.send({"error":"An error has occurred"}); } else { res.send("Note " + id + " deleted!"); } }); }); // ...

Обновление заметок: маршрут UPDATE

А вот и последний маршрут. Обработка запроса PUT – это, по сути, гибрид операций READ и CREATE. Сначала надо найти объект, потом – обновить его в соответствии с поступившими в запросе данными. Сейчас, если вы, испытывая предыдущий фрагмент кода, удалили свою единственную заметку, создайте ещё одну.

Вот код маршрута обновления заметок:

// note_routes.js // ... app.put ("/notes/:id", (req, res) => { const id = req.params.id; const details = { "_id": new ObjectID(id) }; const note = { text: req.body.body, title: req.body.title }; db.collection("notes").update(details, note, (err, result) => { if (err) { res.send({"error":"An error has occurred"}); } else { res.send(note); } }); }); // ...
Теперь любую заметку можно редактировать. Вот, как это выглядит:


Успешное обновление заметки

Обратите внимание на недостаток нашего примера. Если в PUT-запросе не будет тела или заголовка заметки, соответствующие поля в базе будут просто очищены.

Я не нагружал пример дополнительными проверками. Если хотите, можете сами доработать операцию обновления заметок, внося в базу новые данные только в том случае, если запрос сформирован верно.

Итоги

Теперь у вас есть рабочее Node API, которое поддерживает четыре основные операции CRUD. Серверная часть приложения умеет, реагируя на HTTP-запросы клиента, создавать в базе данных заметки, находить их, удалять и редактировать.

Основная цель моего рассказа – познакомить всех желающих со связкой Node + Express + MongoDB и с методикой разработки серверных приложений. Конечно, если сегодня состоялось ваше первое знакомство с этими инструментами, для того, чтобы во всё лучше вникнуть, вам понадобится почитать документацию. Однако, понимание происходящего позволит вам быстро восполнить пробелы в знаниях и приступить к работе над собственными проектами, использовав, в качестве отправной точки, приложение, которым мы с вами тут занимались.

Если у вас есть опыт работы с Node.js, Express и MongoDB в реальных проектах, может быть, вы посоветуете что-нибудь полезное новичкам? А если вы только что всё это впервые попробовали – ждём ваших впечатлений.

Эта статья предназначена для начинающих разработчиков и всех, кто заинтересован в работе с Node js Express . Для освоения вы должны знать основы JavaScript :

Что такое Node.js?

Node.js — это асинхронная среда выполнения JavaScript , основанная на движке JavaScript V8 от Chrome . Она предназначена для создания масштабируемых сетевых приложений.

Node.js позволяет писать JavaScript-код на стороне сервера. Теперь вы можете задуматься, каким образом? JavaScript — это язык, который работает в браузере. Браузер принимает код JavaScript и компилирует его в команды. Создатель Node.js взял движок Chrome и построил среду выполнения (runtime ), чтобы он работал на сервере. Это среда, в которой язык может интерпретироваться. Итак, что у нас есть сейчас? Способ записи JavaScript в бэкэнде.

Что касается определения, вам может быть интересно, что означает термин «асинхронный » в данном контексте. JavaScript однопоточный язык. Поэтому вы не хотите, чтобы события прерывали основной поток выполнения. Это означает обработку событий без прерывания основного потока.

Node.js основан на этом неблокирующем исполнении, что делает его одним из самых быстрых инструментов для создания веб-приложений. В следующем примере «Hello World » многие соединения могут обрабатываться одновременно. При каждом соединении запускается обратный вызов.

В этом Node js Express примере есть шесть простых шагов.

  1. Установите Node.js для своей платформы (MacOS, Windows или Linux )

Node.js

Node.js® — это среда выполнения JavaScript , встроенная в механизм JavaScript V8 для Chrome . Node.js использует управляемые события, неблокирующий ввод-вывод…

Первый шаг состоит в том, чтобы получить экземпляр JavaScript на вашем локальном компьютере. Вбейте nodejs.org в адресной строке браузера или кликните по ссылке , и готово. Стартовое окно должно сразу дать вам то, что вы хотите. Когда я запускаю на своем компьютере Ubuntu , отображается соответствующая версия Node.js для моей операционной системы. Загрузите и установите его. Это предоставим вам инструменты, необходимые для запуска сервера на локальном компьютере:

  1. Откройте командную строку и введите

mkdir myapp cd myapp

Эти команды Node js Express Post универсальны для любой операционной системы. Первая создаст новый каталог внутри каталога, в котором вы сейчас находитесь, mkdir = «make directory» . Последний изменится на этот вновь созданный каталог, cd = «change directory» .

  1. Запустите свой проект и привяжите его к npm

После создания каталога с именем myapp нужно будет запустить проект и связать его с npm .

Npm является сокращением от node package manager (диспетчер пакетов Node ). Это то место, где находятся все пакеты Node . Их можно рассматривать как пакеты кода, модули, которые выполняют определенную функцию. Мы используем интерфейс прикладных программ, API , предоставляемый этими модулями.

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

Она создает файл package.json в папке myapp . Файл содержит ссылки на все пакеты npm, которые загружены в проект.

Команда предложит вам ввести несколько вариантов действий. Можно ввести свой путь через все из них за исключением этого:

entry point: (index.js)

Вы захотите изменить это на:

  1. Установите Express в каталог myapp

Express — это минимальная и гибкая инфраструктура веб-приложений Node.js , которая обеспечивает надежный набор функций для интернета.

Находясь в каталоге myapp , запустите:

npm install express --save

Команда установки продолжит поиск пакета Node js Express files , который необходимо установить. Установите его в свой проект.

Теперь папка node_modules создается в корне вашего проекта. Добавление -save позволяет сохранять пакет в список зависимостей, расположенный в package.json , в каталоге myapp .

Express предоставляет набор инструментов для создания и запуска веб-приложения. Express стал настолько популярен, что теперь он является стандартом в подавляющем большинстве приложений Node.js . Я настоятельно рекомендую использовать Express .

  1. Запустите текстовый редактор и создайте файл с именем app.js

После установки Express Node добавьте в созданный файл, приведенный ниже код:

var express = require("express"); var app = express(); app.get("/", function (req, res) { res.send("Hello World!"); }); app.listen(3000, function () { console.log("Example app listening on port 3000!"); });

Здесь нужно будет использовать пакет, который был недавно установлен. Первая строка объявляет переменную, которая будет содержать модуль express, находящийся в папке node_modules .

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

Метод прослушивания запускает сервер и прослушивает порт 3000 для соединений. Он отвечает «Hello World! » для запросов GET к корневому URL (/) . Для любого другого пути он ответит 404 Not Found .

  1. Запустите приложение

Введите команду:

После выполнения команды введите в браузере http: // localhost: 3000 / , чтобы увидеть результат. Вы также должны увидеть «Example app listening on port 3000 ».

Софт для Windows