В этой серии постов есть сопутствующие видео и упражнения для участников Изучите JavaScript с Эриком Эллиоттом. Для участников видео уроки находятся здесь: Видеокурс« Введение в Node and Express ». Еще не зарегистрированы? "Войти Сейчас".

Node - это среда JavaScript, построенная на том же механизме JavaScript, который используется в веб-браузере Google Chrome. Он имеет несколько замечательных функций, которые делают его привлекательным выбором для создания промежуточных уровней серверных приложений, включая веб-серверы и веб-службы для API платформы.

Модель ввода-вывода, управляемая неблокирующими событиями, дает ей очень привлекательную производительность, легко опережая многопоточные серверные среды, такие как PHP и Ruby on Rails, которые блокируют ввод-вывод и обрабатывают несколько одновременных пользователей, создавая отдельные потоки для каждого.

Я перенес рабочие приложения с десятками миллионов пользователей как с PHP, так и с Ruby on Rails на Node, что привело к увеличению в 2–10 раз как времени обработки ответа, так и количества одновременных пользователей, обслуживаемых одним сервером.

Функции узла:

  • Быстро! (По умолчанию неблокирующий ввод-вывод).
  • Управляемый событиями.
  • Первоклассные сети.
  • Первоклассный потоковый API.
  • Отличные стандартные библиотеки для взаимодействия с ОС, файловой системой и т. Д.
  • Поддержка скомпилированных двоичных модулей, когда вам нужно расширить возможности Node с помощью языка более низкого уровня, такого как C ++.
  • Нам доверяют и поддерживают крупные предприятия, использующие критически важные приложения. (Adobe, Google, Microsoft, Netflix, PayPal, Uber, Walmart и т. Д.…).
  • Легко начать.

Установка узла

Прежде чем мы начнем, давайте убедимся, что у вас установлен Node. Всегда есть две поддерживаемые версии Node: версия с долгосрочной поддержкой (стабильная) и текущая версия. Для производственных проектов попробуйте версию LTS. Если вы хотите поиграть с передовыми функциями будущего, выберите текущую версию.

Окна

Откройте Веб-сайт узла и нажмите одну из больших зеленых кнопок установки.

Mac или Linux

Если вы работаете в системе Mac или Linux, я предпочитаю установить Node с помощью nvm.

Чтобы установить или обновить nvm, вы можете использовать скрипт установки с помощью cURL:

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash

или Wget:

wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash

После установки nvm вы можете использовать его для установки любой версии Node.

Привет, мир!

Node & Express настолько просты, что вы получаете базовый веб-сервер для обслуживания «Hello, world!» примерно в 12 строках кода:

Перед запуском этого кода вам нужно немного настроить приложение. Начнем с создания нового репозитория git:

mkdir my-node-app && cd my-node-app
git init

Вам понадобится package.json файл для хранения конфигурации вашего приложения. Для его создания используйте npm, который устанавливается вместе с Node:

npm init

Ответьте на несколько вопросов (название приложения, репозиторий git и т. Д.), И все будет готово. Затем вам нужно будет установить Express:

npm install --save express

Установив зависимости, вы можете запустить приложение, набрав:

node index.js

Проверьте это с помощью curl:

curl localhost:3000

Или посетите localhost:3000 в своем браузере.

Вот и все! Вы только что создали свое первое приложение Node.

Переменные среды

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

Вы также должны использовать переменные среды для внедрения секретов приложения, таких как ключи API, в приложение, не проверяя их в системе управления версиями. Некоторые среды развертывания позволяют использовать .env файлы, содержащие параметры конфигурации для вашего приложения, но тогда возникает вопрос: «как мне загрузить .env параметры в переменные среды, которые приложение может использовать?»

Для этого попробуйте dotenv для Node:

npm install --save dotenv

Затем добавьте одну строку в начало файла записи:

require('dotenv').config();

Теперь вы можете загрузить параметр port из файла .env. Создайте новый файл с именем .env в корне вашего проекта со следующим:

PORT=5150

Сохраните его и перезапустите приложение, и вы должны увидеть:

listening on port 5150

Вы не хотите проверять свой .env файл в Git, поэтому добавьте его в свой .gitignore файл. Фактически, пока мы занимаемся этим, давайте добавим еще кое-что:

Вы по-прежнему хотите задокументировать параметры, необходимые для вашего приложения, поэтому я хочу вернуть копию файла .env с отредактированными секретами приложения. Новые пользователи приложения могут скопировать файл, назвать его .env, настроить параметры и начать работу. Я называю зарегистрированную копию .env.example и включаю инструкции для разработчиков в README.md файл проекта.

PORT=5150
AWS_KEY=<your AWS key here>

Обратите внимание, что вы должны быть осторожны, чтобы все секреты приложения были отредактированы в вашем .env.example файле, как показано.

Не проверяйте секреты своего приложения в репозитории Git.

Тестирование приложений узла

Мне нравится тестировать приложения Node с помощью Supertest, который устраняет проблемы с HTTP-соединением и предоставляет простой Fluent API. Для конечных точек http я использую функциональные тесты, что означает, что меня не волнует имитация баз данных и т. Д. Я просто ввел в API некоторые значения и ожидаю ответного ответа.

Вот простой пример с Супертестом и Лентой:

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

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

module.exports = app;

По этой и другим причинам я разделил свое приложение на несколько частей: app.js, где я создаю и настраиваю само приложение, и server.js, где я импортирую приложение, обрабатываю сетевые данные и вызываю app.listen().

Установка пути к узлу

Когда вы начинаете разбивать свое приложение на модули, вам может надоесть относительный путь, требующий вроде этого:

const app = require('../../app');

К счастью, вам не нужно их использовать. Поместите файлы приложения в каталог с именем source или src, а затем установите переменную среды NODE_PATH. Вы можете использовать cross-env, чтобы установить переменные среды, чтобы они работали на разных платформах (прочтите, запустите приложение в Windows):

npm install --save cross-env

Затем в своих package.json скриптах вы можете безопасно установить переменные среды:

С установленным NODE_PATH вам могут потребоваться такие модули:

const app = require('app');

Намного лучше!

ПО промежуточного слоя

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

Промежуточное ПО - это функция, которая передает объекты запроса и ответа, а также вызываемую функцию продолжения, называемую next(). Представьте, что вы хотите добавить requestId к каждой паре запрос / ответ, чтобы вы могли легко отследить их до отдельного запроса при отладке или поиске чего-либо в журналах.

Вы можете написать такое промежуточное ПО:

Управление памятью

Поскольку Node является однопоточным, это означает, что все ваши пользователи будут использовать одно и то же пространство памяти. Другими словами, в отличие от браузера, вы должны быть осторожны, чтобы не хранить пользовательские данные в замыканиях, где к ним могут получить доступ другие соединения. По этой причине я предпочитаю использовать res.locals для хранения временных данных пользователя, которые доступны только во время цикла запроса / ответа этого пользователя:

Это также лучший способ сохранить упомянутый выше requestId.

Отладка приложений узла

Node v6.4.x + поставляется со встроенным отладчиком Chrome, поэтому вы можете подключить Node для использования тех же инструментов, которые вы используете для отладки своих JS-приложений в браузере.

Чтобы использовать его, просто добавьте операторы отладчика в любое место, где вы хотите установить точку останова, а затем запустите:

node --inspect-brk source/app.js

Откройте chrome://inspect/ в браузере и щелкните цель, и вы получите интерактивную среду отладки.

Я использую --inspect-brk по умолчанию, чтобы указать, что он прерывается в начале, но вы можете не указывать его. Помните, что вам, вероятно, нужно будет выбрать свой маршрут в браузере или из curl, чтобы запустить обработчики маршрута и достичь точек останова.

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

Пусть это рухнет

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

Чего категорически нельзя делать:

process.on('uncaughtException', (err) => {
  console.log('Oops!');
});

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

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

Я написал модуль, упрощающий обработку ошибок с помощью Node. Ознакомьтесь с экспресс-обработчиком ошибок.

Восстановление после сбоя

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

Для этого очень рекомендую PM2. Я использую его, и ему доверяют такие компании, как Microsoft, IBM и PayPal.

Для установки запустите npm install -g pm2. Установить локально с помощью npm install --save-dev pm2. Затем вы можете запустить приложение, используя pm2 start source/app.js.

Вы можете управлять запущенными экземплярами приложений с помощью pm2 list и останавливать экземпляры с помощью pm2 stop. Подробнее см. Быстрый старт.

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

Заключение

Мы только прикоснулись к Node. Можно еще многое узнать, включая управление сеансом, аутентификацию токена, разработку API и т. Д. Я рассмотрел некоторые из этих тем более подробно в Программировании приложений JavaScript (бесплатно в Интернете).

Хотите узнать больше о Node? Мы запускаем новую серию видео об узлах для участников EricElliottJS.com. Если вы не являетесь участником, вы что-то теряете.

Эрик Эллиотт - автор книг Программирование приложений JavaScript (О’Рейли) и Изучение JavaScript с Эриком Эллиоттом. Он участвовал в разработке программного обеспечения для Adobe Systems, Zumba Fitness, The Wall Street Journal, ESPN, BBC и ведущие музыканты, включая Usher, Frank Ocean, Metallica и многие другие.

Он проводит большую часть времени в районе залива Сан-Франциско с самой красивой женщиной в мире.