Для початківців, JavaScript

Node.js для початківців

У цій статті я розповім про основні принципи Node.js, його плюси та мінуси і покажу як розпочати розробку. Але перед тим, як почати працювати з Node.js, бажано зрозуміти різницю між Node.js і традиційними серверними мовами (PHP, Python, Ruby).

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

Сподіваюся, що ви знайомі з асинхронним програмуванням. Як не крути, це основа в Ajax. Усі функції базових модулів у Node.js асинхронні. Тому всі функції, які зазвичай в інших мовах блокують потік, в Node.js натомість виконуються у фоні. Це найважливіша річ для розуміння Node.js. Наприклад, якщо ви читаєте файл, то має бути вказана функція, яка здійсниться після завершення читання.

Ти зробиш усе!

Node.js — лише середовище, тому всю роботу доведеться робити вручну. У Node.js за замовчуванням немає навіть сервера HTTP! І це засмучує, проте Node.js підкуповує високою продуктивністю веб-додатків. Лише один скрипт обробляє всі з'єднання з клієнтом. Таке рішення значно знижує кількість ресурсів, що використовуються в додатку. Наприклад, ось код простого Node.js програми.

А ось його еквівалент на PHP:

У таблиці порівнюється час виконання обох прикладів.

Обидва приклади виконувались у командному рядку, тому затримки на запуск веб-сервера тут немає. Я запускав кожен тест по 10 разів та взяв середній результат. PHP виявився швидше на малій кількості ітерацій, але ця перевага швидко зникає, коли кількість ітерацій збільшується. Коли я завершив усі тести, то PHP виявився на 93% повільнішим за Node.js.

Node.js швидкий, але є кілька речей, які необхідно знати, щоб використовувати його правильно.

Node.jsпобудований на модульній архітектурі: це зроблено для спрощення створення складних програм. Модулі схожі на бібліотеки C або units в Pascal. Кожен модуль містить набір функцій, які належать до «теми» цього модуля. Наприклад, модуль http містить специфічні функції для HTTP. Node.js також містить кілька модулів із коробки: для роботи з файловою системою, створення HTTP та TCP/UPD серверів та ін.

Модуль підключається за допомогою функції require() :

Функція приймає ім'я модуля на вхід. Після цього Node.js перевіряє папку node_modules у каталозі програми та шукає в ній папку з назвою http. Якщо Node.js не знайшов каталог node_modules або http всередині цього каталогу, тоді він звернутися до глобального кешованого модуля. Замість імені у функцію require() можна передавати відносний або абсолютний шлях до модуля:

Модулі інкапсулюють частини коду. Код усередині модуля переважно приватний. Це означає, що функції та змінні оголошені в модулі доступні лише всередині модуля. Але Node.js дозволяє створювати загальнодоступні функції або змінні. За це відповідає об'єкт exports. Приклад:

У цьому прикладі створюється змінна PI, яку можна використовувати лише усередині модуля. Наступні 2 функції створюють об'єкт exports. Ці функції доступні поза модулем, тому що визначені через export exports . В результаті змінна ПІ повністю захищена від зовнішнього втручання. Таким чином функції area і cercumference поводитимуться як і повинні (залежно від значення параметра r).

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

Звичайно, перш ніж писати та запускати додатки на Node.js, необхідно його встановити. На сайті nodejs.org можна завантажити інсталятор для Windows або OS X. Для Linux можна використовувати будь-який пакетнийменеджер. Для встановлення Node.js потрібно відкрити командний рядок та ввести:

Node.js є у sid репозиторіях; можете додати їх до списку вихідних кодів:

Встановлення пакетів sid на старі системи може пошкодити вашу систему. Тому після встановлення бажано видалити /etc/apt/sources.list.d/sid.list

Встановлення нових модулів

У Node.js є менеджер пакетів, який називається Node Package Manager (NPM). NPM встановлюється автоматично з Node.js, і його можна використовувати для встановлення нових модулів. Щоб встановити новий модуль, потрібно відкрити командний рядок, перейти в потрібну папку та виконати наступну команду:

Синтаксис цієї команди залежить від операційної системи. Команда встановить модуль, вказаний замість 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.js, зокрема розбір аргументів запиту. Однак це не так уже й складно. І в наступному прикладі я це продемонструю:

Цей код використовує метод parse() модуля url, який є основниммодулем Node.js для перетворення url в об'єкт. Об'єкт, що повертається, має властивість query , яке витягує url параметри. Я зберіг цей код у файл get.js і виконав наступну команду:

Потім у браузері відкрив сторінку http://localhost:8080/?data=put_some_text_here.

Читання та запис файлів

Для роботи з файлами у Node.js існує модуль fs. Цей модуль має методи fs.readFile() і fs.writeFile() для читання та запису файлів. Я розповім про них детальніше після знайомства з прикладом:

Я зберіг цей код у файлі files.js. Перезапускаючи цей скрипт, потрібно створити файл з ім'ям test.txt в директорії з files.js.

Цей код демонструє роботу методів fs.readFile() та fs.writeFile(). Щоразу, коли сервер отримує запит, скрипт зчитує число з файлу, збільшує його і записує нове число в цей же файл. Метод fs.readFile() приймає 3 аргументи: ім'я файлу для читання, очікуване кодування та функцію, що викликається.

Запис у файл набагато простіше. Не потрібно очікувати якихось результатів, хоча у реальному додатку слід перевіряти наявність помилок. Метод fs.writeFile() приймає як аргументи ім'я файлу та дані для запису. Цей метод також може приймати 3-й та 4-й необов'язкові аргументи для вказівки кодування та функції зворотного виклику.

Я запустив скрипт командою:

Потім відкрив у браузері http://localhost:8080 та перезапустив кілька разів. Може здатися, що у коді була помилка, т.к. число збільшилося на 2. Це не помилка, тому що насправді було надіслано 2 запити. Перший запит автоматично зробив браузер, коли запитав favicon.ico, і другим запитом був http://localhost:8080.

Хоча технічно це не помилка, така поведінка скрипта не є очевидною. Тому я додав виправлення,який перевіряє url. Ось виправлений код:

Тепер скрипт працює так, як очікується.

Доступ до Mysql

Традиційні серверні технології мають вбудовані засоби підключення та надсилання запитів до бази даних. Для Node.js необхідно встановити спеціальну бібліотеку. Я вибрав найбільш стабільну та просту у використанні node-mysql. Повністю модуль називається [email protected](після @ йде версія). Щоб встановити модуль, я відкрив консоль, перейшов у директорію, де зберігаються скрипти і виконав наступну команду:

Ця команда завантажить та встановить модуль, а також створить папку node_modules у поточній директорії. Далі я написав приклад використання цього модуля:

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

Я зберіг цей код у файл mysql.js і виконав команду:

Потім перейшов у браузер на http://localhost:8080 і браузер запропонував завантажити файл в JSON форматі.

Висновок

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

Node.js – це перспективна технологія та відмінний вибір для високонавантажених програм. Цебуло доведено такими корпораціями, як Microsoft, eBay та Yahoo. Якщо ви не впевнені у виборі хостингу для вашого вебсайту або програми, ви завжди можете використовувати дешеве рішення VPS або різні хмарні сервіси, наприклад Microsoft, Azure і Amazon EC2.

Автор: Євген Земченков

Веб програміст. Розробляє інтернет-магазини, веб-програми.