7 days of WordPress plugins, themes & templates - for free!* Unlimited asset downloads! Start 7-Day Free Trial
Advertisement
  1. Code
  2. Web Development

Node.js для начинающих

Scroll to top
Read Time: 12 mins

Russian (Pусский) translation by Ilya Nikov (you can also view the original English article)

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

Введение

Чтобы начать использовать Node.js, вы должны сначала понять различия между Node.js и традиционными средами сценариев на стороне сервера (например: PHP, Python, Ruby и т.д.).

Асинхронное программирование

Node.js использует модульную архитектуру для упрощения создания сложных приложений.

Скорее всего, вы знакомы с асинхронным программированием; это, в конце концов, «А» в Ajax. Каждая функция в Node.js является асинхронной. Следовательно, все, что обычно блокирует поток, вместо этого выполняется в фоновом режиме. Это самое важное, что нужно помнить о Node.js. Например, если вы читаете файл в файловой системе, вы должны указать функцию обратного вызова, которая выполняется, когда операция чтения будет завершена.

Вы делаете все!

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

И вот эквивалент, написанный на PHP:

Теперь давайте посмотрим на эти числа. В следующей таблице перечислено время ответа в миллисекундах для этих двух простых приложений:

Количество итераций Node.js PHP
100 2,00 0,14
10'000 3,00 10,53
1'000'000 15.00 1119,24
10'000'000 143,00 10621,46
1'000'000'000 11118,00 1036272,19

Я выполнил два приложения из командной строки, чтобы сервер не задерживал выполнение приложений. Я провел каждый тест десять раз и усреднил результаты. PHP заметно быстрее с меньшим количеством итераций, но это преимущество быстро растворяется по мере увеличения количества итераций. Когда все сказано и сделано, PHP на 93% медленнее, чем Node.js!

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

Модули

Node.js использует модульную архитектуру для упрощения создания сложных приложений. Модули сродни библиотекам в C или юнитам в Паскале. Каждый модуль содержит набор функций, связанных с «объектом» модуля. Например, http модуль содержит функции, специфичные для HTTP. Node.js предоставляет несколько основных модулей из коробки, чтобы помочь вам получить доступ к файлам в файловой системе, создать HTTP и TCP / UDP-серверы и выполнять другие полезные функции.

Включить модуль легко; просто вызовите функцию require(), например:

Node.js - это только среда; вы должны делать все сами.

Функция require() возвращает ссылку на указанный модуль. В случае этого кода ссылка на http модуль сохранится в переменной http.

В приведенном выше коде мы передали имя модуля функции require(). Это заставляет Node искать папку node_modules в каталоге нашего приложения и искать модуль http в этой папке. Если Node не находит папку node_modules (или модуль http внутри нее), он затем просматривает глобальный кеш модуля. Вы также можете указать фактический файл, передав относительный или абсолютный путь, например:

Модули представляют собой инкапсулированные фрагменты кода. Код внутри модуля в основном приватный - это означает, что функции и переменные, определенные внутри них, доступны только изнутри модуля. Вы можете, однако, выставить функции и/или переменные, которые будут использоваться вне модуля. Для этого используйте объект exports и заполните его свойства и методы с помощью фрагментов кода, которые вы хотите открыть. Рассмотрим следующий пример:

Этот код создает переменную PI, доступ к которой может получить только код, содержащийся в модуле; он недоступен вне модуля. Затем в объекте exports создаются две функции. Эти функции доступны вне модуля, потому что они определены для объекта экспорта. В результате PI полностью защищен от внешних помех. Поэтому вы можете быть уверены, что область () и окружность () всегда будут вести себя так, как должны (пока значение будет задано для параметра r).

Глобальная область видимости

Node - это среда JavaScript, работающая на движке Google's V8 JavaScript. Таким образом, мы должны следовать рекомендациям, которые мы используем при разработке на клиентской стороне. Например, мы должны избегать добавления чего-либо в глобальную область видимости. Это, однако, не всегда возможно. Глобальная область в Node это GLOBAL (в отличие от window в браузере), и вы можете легко создать глобальную переменную или функцию, опуская ключевое слово var, например:

Еще раз, по возможности, следует избегать глобальной области видимости. Поэтому будьте осторожны и не забывайте использовать var при объявлении переменной.

Установка

Естественно, нам нужно установить Node, прежде чем мы сможем написать и выполнить приложение. Установка выполняется довольно просто, если вы используете Windows или OS X; сайт nodejs.org предлагает инсталляторы для этих операционных систем. Для Linux используйте любой менеджер пакетов. Откройте терминал и введите:

или:

Node.js находится в sid-репозиториях; вам может потребоваться добавить их в список источников:

Но имейте в виду, что установка пакетов sid на более старых системах может привести к повреждению вашей системы. Будьте осторожны и удалите /etc/apt/sources.list.d/sid.list после завершения установки Node.

Установка новых модулей

У Node.js есть менеджер пакетов, называемый Node Package Manager (NPM). Он автоматически устанавливается с помощью Node.js, и затем вы используете NPM для установки новых модулей. Чтобы установить модуль, откройте терминал/командную строку, перейдите в нужную папку и выполните следующую команду:

Неважно, какая у вас ОС; указанная выше команда установит модуль, который вы укажете вместо module_name.

Приложение Hello World

Естественно, наш первый скрипт Node.js напечатает текст «Hello World!» на консоль. Создайте файл hello.js и введите следующий код:

Теперь давайте выполним сценарий. Откройте терминал/командную строку, перейдите к папке, содержащей hello.js, и выполните следующую команду:

Вы должны увидеть как  'Hello World!' отображается в консоли.

HTTP-сервер

Перейдем к более продвинутому приложению; но оно не такое уж сложное, как вы думаете. Давайте начнем со следующего кода. Прочитайте комментарии, а затем объяснение ниже:

Этот код очень прост. Вы можете отправить больше данных клиенту, используя response.write() , но вы должны вызвать его перед вызовом response.end(). Сохраните этот код как http.js и введите его в консоль:

Откройте браузер и перейдите по адресу http://localhost:8080. Вы должны увидеть текст «Hello HTTP!».

Обработка URL-параметров

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

Этот код использует метод parse() модуля url, основного модуля Node.js, для преобразования URL-адреса запроса в объект. Возвращаемый объект имеет свойство query, которое извлекает параметры URL. Сохраните этот файл как get.js и выполните его с помощью следующей команды:

Затем перейдите по адресу http://localhost:8080/?Data=put_some_text_here в вашем браузере. Естественно, изменение значения параметра data не нарушит сценарий.

Чтение и запись файлов

Для управления файлами в Node мы используем модуль fs (основной модуль). Мы читаем и записываем файлы, используя методы fs.readFile() и fs.writeFile(), соответственно. Я объясню аргументы после следующего кода:

У Node.js есть менеджер пакетов, называемый Node Package Manager (NPM). Он автоматически устанавливается с помощью Node.js

Сохраните это как files.js. Перед запуском этого сценария создайте файл с именем test.txt в том же каталоге, что и files.js.

Этот код демонстрирует методы fs.readFile() и fs.writeFile(). Каждый раз, когда сервер получает запрос, скрипт считывает число из файла, увеличивает это число и записывает его в файл. Метод fs.readFile() принимает три аргумента: имя файла для чтения, ожидаемую кодировку и функцию обратного вызова.

Запись в файл, по крайней мере в этом случае, намного проще. Нам не нужно ждать каких-либо результатов, хотя вы будете проверять наличие ошибок в реальном приложении. Метод fs.writeFile() принимает имя файла и данные в качестве аргументов. Он также принимает третий и четвертый аргументы (оба являются необязательными), чтобы указать кодировку и функцию обратного вызова соответственно.

Теперь давайте запустим этот скрипт со следующей командой:

Откройте его в браузере (http://localhost:8080) и обновите его несколько раз. Теперь вы можете подумать, что в коде есть ошибка, потому что кажется, что число увеличивается на два. Это не ошибка. Каждый раз, когда вы запрашиваете этот URL-адрес, на сервер отправляются два запроса. Первый запрос автоматически создается браузером, который запрашивает favicon.ico, и, конечно, второй запрос для URL (http://localhost:8080).

Хотя это поведение технически не является ошибкой, но мы такого не хотим. Мы можем легко это исправить, проверив URL-адрес запроса. Вот поправленный код:

Попробуйте теперь; этот код должен работать должным образом.

Доступ к базам данных MySQL

Большинство традиционных серверных технологий имеют встроенные средства подключения к базе данных и выполнения запросов к ней. Для Node.js вам необходимо установить библиотеку. Для этого урока я выбрал стабильный и простой в использовании модуль node-mysql. Полное имя этого модуля - mysql@2.0.0-alpha2 (все после @ - номер версии). Откройте консоль, перейдите в каталог, в котором вы сохранили свои скрипты, и выполните следующую команду:

Она загружает и устанавливает модуль, а также создает папку node_modules в текущем каталоге. Теперь давайте посмотрим, как мы можем использовать его в нашем коде; см. следующий пример:

Делать запрос к базе данных с помощью этой библиотеки легко; просто введите строку запроса и функцию обратного вызова. В реальном приложении вы должны проверить наличие ошибок (параметр error не будет undefined при возникновении ошибок) и отправить коды ответов в зависимости от успеха или ошибки запроса. Также обратите внимание, что мы установили Content-Type в x-application/json, который является допустимым типом MIME для JSON. Параметр rows содержит результат запроса, и мы просто преобразуем данные из rows в структуру JSON, используя метод JSON.stringify() .

Сохраните этот файл как mysql.js и выполните его (если у вас установлен MySQL):

Откройте адрес http://localhost:8080 в своем браузере, и вам будет предложено загрузить файл в формате JSON.

Заключение

Каждая функция в Node.js является асинхронной.

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

Node.js - это многообещающая технология и отличный выбор для приложения с высокой нагрузкой. Это подтверждают корпорации, такие как Microsoft, eBay и Yahoo. Если вы не уверены в размещении своего сайта/приложения, вы всегда можете использовать дешевое решение VPS или различные облачные сервисы, такие как Microsoft Azure и Amazon EC2. Оба эти сервиса обеспечивают масштабируемую среду по разумной цене.

Не забудьте оставить комментарий, если у вас есть вопросы!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.