Знайомство з NodeJs

nodejs
javascript
сервер
Знайомство з NodeJs cover image

Вступ

Намагаючись дізнатися про веб

розробки, ми зазвичай виявляємо, що інтерфейс значно доступніший, ніж серверний. На це є багато причин, зокрема відчуття миттєвого зворотного зв’язку, яке виникає після зміни певного елемента сторінки в коді та помічення зміни, застосованої до веб-сайту. Цей відгук часто корисний для початківців, оскільки він дає їм змогу коригувати свій код і вчитися на своїх помилках. На жаль, це не так із серверною частиною: часто значний обсяг роботи присвячено попередньому налаштуванню середовища та встановленню залежностей, необхідних для того, щоб отримати просте повідомлення «Hello World» для появи на терміналі. На щастя, у спільноті з відкритим вихідним кодом постійно досягається великий прогрес у полегшенні процесу розробки фреймворків, і вдосконалення досвіду розробників є хорошим прикладом цього зручний код у Javascript і пропонує різноманітні вбудовані інструменти та функції, які відрізняють його від конкурентів. У цій статті ми досліджуємо NodeJs та його екосистему за допомогою практичного підходу, створюючи повністю функціональний проект.

Що ми будемо будувати?

Програми ToDo — це проект, який підійде для початківців, які вивчають інтерфейсну розробку. Ось чому ми вирішили створити API списку Todo. Це дозволить нам додати постійність даних до нашого інтерфейсу та дасть нам можливість маніпулювати цими даними (додаючи, оновлюючи, видаляючи завдання тощо).

Остаточний код можна знайти тут.

Наші інструменти

Для цього проекту ми будемо використовувати спрощений технічний стек. Його можна розглядати як мінімальну версію багатьох інструментів, які ви знайдете в реальних проектах, тому що ідеї вищого рівня ті самі. Деталі впровадження та вибір конкретного інструменту над іншим не важливі для початку.

  • NodeJs, як ми вже згадували, є одним із найпопулярніших фреймворків Javascript для створення програм на стороні сервера.

  • ExpressJs — це мінімальний фреймворк Javascript, який використовується поверх NodeJS. Це прискорює процес розробки завдяки використанню багатьох вбудованих функцій. Він також використовується як спосіб стандартизації практик розробки в проектах NodeJS, щоб полегшити його використання для інженерів.

  • LowDB - це проста база даних у пам'яті. Його простота дозволяє нам продемонструвати, як взаємодіяти з базою даних у проекті NodeJs, не торкаючись більш складних тем, таких як розгортання та конфігурації.

Тепер, коли ми визначили всі інструменти, які будемо використовувати, давайте перейдемо до наших клавіатур і почнемо кодувати!

Встановлення

Node доступний на всіх платформах. Усі посібники зі встановлення можна знайти на офіційному веб-сайті. Користувачі Windows повинні обов’язково додати вузол шлях до змінних середовища, щоб його можна було використовувати в командному рядку.

Нам також знадобиться встановити npm. Npm — стандартний менеджер пакетів для NodeJ. Це дозволить нам керувати нашими залежностями проекту. Посібник із встановлення можна знайти тут.

Ініціалізація проекту

Перейдіть за посиланням і клонуйте стартовий проект:

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

npm install

Це встановить усі залежності проекту, указані у файлі package.json. package.json — це файл, який знаходиться в корені будь-якого проекту Javascript/NodeJs, він містить метадані про останній і використовується для керування всіма залежностями проекту, сценаріями та версіями.

Після встановлення всіх залежностей ми можемо запустити нашу програму:

npm run start

“start” – це скрипт, який ми вказали в пакеті. файл json. Він визначає файл входу до нашої програми, який у нашому випадку є app.js.

У вашому терміналі має з’явитися таке повідомлення:

nodejs_1

Це означає, що наш сервер успішно запущений і прослуховує будь-які запити, надіслані на порт 3000. Давайте подивимося на app.js і пояснимо, що тут відбувається:

nodejs_2

App.js — це файл запису нашого проекту (і єдиний на даний момент). Ми створюємо екземпляр експрес-додатку під назвою app, вказуємо, що всі запити, які мають http-метод «GET» і підшлях '/', будуть оброблятися цим маршрутом, передаємо функцію під назвою проміжне програмне забезпечення, яке приймає об'єкт запиту та відповіді як параметри. Це дуже важливо, оскільки запит містить усю інформацію, необхідну для його обробки (параметри, тіло запиту, заголовки запиту тощо), а об’єкт відповіді – це той, який буде повернено клієнту. Ми починаємо з того, що просто надсилаємо повідомлення «Hello world». Після цього ми змушуємо нашу програму слухати будь-які вхідні запити на вказаний порт (у нашому випадку 3000) і реєструвати повідомлення «Прослуховування порту 3000», щоб вказати, що наша програма запущена та готова приймати запити.

Відкрийте свій термінал і на панелі посилань введіть «localhost:3000/» і натисніть Enter. Це вказаний шлях, який ми можемо використовувати для локального доступу до нашого сервера. Ви отримаєте таке повідомлення:

nodejs_3

Конфігурація бази даних

Lowdb — це база даних із відкритим вихідним кодом, проста у використанні та не потребує спеціального налаштування. Загальна ідея полягає в тому, щоб зберігати всі дані в локальному файлі JSON. Після встановлення LowDB (що було зроблено, коли ми встановили всі залежності), ми можемо додати наступний код до db.js:

nodejs_4

Цей код дуже схожий на той, що міститься в офіційній документації LowDB. Ми трохи налаштували його для власного використання. Давайте пояснимо це рядок за рядком:

Перші кілька рядків призначені для імпорту необхідних залежностей. «Join» — це службова функція, доступна в модулі «path». Це один із основних модулів NodeJs, який пропонує багато методів для обробки та обробки шляхів. «Low» і «JSONFile» — це два класи, доступні LowDB. Перший створює екземпляр файлу json, який міститиме наші дані. Другий створює фактичний екземпляр бази даних, який буде працювати з ним. Нарешті, “lodash” є однією з найбільш використовуваних бібліотек javascript, що пропонує широкий спектр службових функцій для типових завдань програмування. Ми додаємо його до екземпляра нашої бази даних, щоб ми могли використовувати його передові методи для обробки наших даних.

Спочатку ми вказуємо шлях до файлу db.json. Це файл, який міститиме наші дані та буде передано в LowDB. Якщо файл не знайдено за вказаним шляхом, LowDB створить його.

Потім ми передаємо шлях до файлу адаптеру LowDB і передаємо його новому екземпляру бази даних LowDB. Потім змінну «db» можна використовувати для зв’язку з нашою базою даних. Після створення екземпляра бази даних ми читаємо з файлу json за допомогою db.read(). Це встановить поле «дані» в нашому екземплярі бази даних, щоб ми могли отримати доступ до вмісту бази даних. Зверніть увагу, що перед цим рядком ми поставили «чекати». Це означає, що вирішення цієї інструкції може зайняти невідомий проміжок часу, і що процес NodeJs повинен зачекати на її виконання, перш ніж продовжити роботу з рештою коду. Ми робимо це тому, що для операції читання потрібен доступ до пам’яті зазначеного файлу, а час для виконання такої операції залежить від технічних характеристик вашого комп’ютера.

Тепер, коли ми маємо доступ до поля даних, ми встановлюємо його як об’єкт, що містить порожній масив дописів, точніше, ми перевіряємо, чи файл містить попередні дані, і встановлюємо порожній масив, якщо це не так.

Нарешті, ми виконуємо db.write(), щоб застосувати зміни, які ми внесли до даних, і експортуємо екземпляр бази даних, щоб його можна було використовувати в інших файлах нашого проекту.

Загальний робочий процес запитів/відповідей

Розгляньте наступну схему:

nodejs_5

Він показує загальну архітектуру, застосовану в безлічі серверних програм, створених за допомогою NodeJs/Express. Розуміння загального робочого процесу, що стоїть за обробкою запиту, не тільки дозволить вам створювати та структурувати програми NodeJs, але й дозволить вам перенести ці концепції практично в будь-який технічний стек на ваш вибір. Ми дослідимо різні рівні, які заважають цьому процесу, і пояснимо їхню роль:

## Рівень запиту HTTP

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

  • Маршрутизатори: тут ми маємо на увазі експрес-маршрутизатори, але цю концепцію можна знайти в багатьох базових фреймворках. Маршрутизатори — це спосіб застосувати логічний розподіл у нашій бізнес-логіці до нашого коду, тобто кожен набір елементів, які мають подібні функції, обробляється одним записом і може бути відокремлений від решти наборів. Перевага цього полягає в тому, що кожен компонент коду стає незалежним від інших, його легше підтримувати та розширювати. Зокрема, як приклад, усі запити, які відповідають умовам загального URL-адреси «/posts», оброблятимуться одним маршрутизатором. Залежно від їх методу http (GET, POST тощо), використовуватиметься інший контролер.

  • Контролери: контролер отримує відфільтровані запити від маршрутизаторів, застосовує додаткову обробку та викликає відповідні методи обслуговування.

Рівень бізнес-логіки

Цей рівень є унікальним залежно від конкретних випадків використання програми та бізнес-логіки, що стоїть за ним.

  • Служби: служби — це набір методів, які містять основну логіку програми. Вони також взаємодіють із базою даних за допомогою ORM/ODM.

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

  • ODM/ORM: ORM і ODM діють як посередники між службами та базою даних. Їхня роль полягає в тому, щоб забезпечити абстракцію високого рівня для бази даних, яка дозволяє розробнику писати код на мові програмування за власним вибором замість спеціальних мов баз даних, таких як SQL.

Рівень збереження даних

  • Бази даних: як ми згадували раніше, майже всі програми потребують певної форми збереження даних. Ця частина обробляється базами даних, і залежно від характеру даних, бізнес-логіки та багатьох інших міркувань вибір певної бази даних над іншою вважається вирішальним для ефективності та масштабованості програми.

Приклад: додавання публікації

Тепер, коли ми зрозуміли загальну ідею архітектури, давайте застосуємо її до нашого простого прикладу. Ми запровадимо функцію додавання допису справ у наш додаток. Припустімо, що будь-яка публікація має унікальний ідентифікатор, який дозволить нам пізніше ідентифікувати її в нашій базі даних, заголовок є рядком і порядок типу integer. Дотримуючись нашої схеми, ми почнемо з впровадження маршрутизатора. Додайте наступний код до файлу index.js:

Starting a server in ExpressJS

Це файл нашого маршрутизатора. Ми імпортуємо експрес-метод і метод “addPost” із нашого контролера (незабаром ми запровадимо цей), створюємо екземпляр експрес-маршрутизатора та прив’язуємо метод addPost до нашого маршрутизатора, тобто для кожного запиту, який має кореневий шлях і http метод “POST”, для його обробки буде викликано метод “addPost”.

Перш ніж реалізувати наш метод у контролері, ми посилаємося на новий маршрутизатор у нашому головному файлі app.js і вказуємо його шлях як «/posts»: усі маршрути із зазначеними шляхами будуть перенаправлені на цей маршрутизатор, тому його можна буде обробити різними методами контролера:

Starting a server in ExpressJS

Ми імпортуємо маршрутизатор і називаємо його «пости». app.use(“/posts”,..) означає, що всі запити з підшляхом “/posts”, незалежно від їх методу http, будуть спрямовані на вказаний маршрутизатор.

Інші зміни в app.js включають імпорт файлу конфігурації бази даних для його виконання та використання express.json() як проміжного програмного забезпечення, щоб ми могли отримати доступ до об’єкта тіла запиту.

Тепер, коли наші маршрути встановлено, ми можемо додати метод addPost у файл controller.js:

Starting a server in ExpressJS

«addPost» — це функція проміжного програмного забезпечення, яка приймає як параметри запит, об’єкти відповіді та наступну функцію. Коли викликається наступна функція, процес переходить до наступного проміжного програмного забезпечення в ланцюжку або завершує запит. У коді методу ми витягуємо заголовок і порядок із тіла запиту та передаємо їх як параметри службовій функції «createPost». Ця функція приймає атрибути публікації, створює нову публікацію та повертає її. Після створення нового повідомлення ми повертаємо його клієнту разом із кодом статусу 200, що означає, що запит успішно виконано. Ви можете помітити, що наш код розміщено всередині блоку try/catch, щоб переловлювати будь-які неочікувані помилки та передавати їх наступному проміжному ПЗ. Вважається найкращою практикою підключити до всіх маршрутизаторів проміжне програмне забезпечення обробки помилок, яке виділяє помилку та повертає клієнту значуще повідомлення про помилку.

Все, що залишилося, це реалізувати функцію «createPost» у service.js:

nodejs_6

Як ми згадували раніше, пояснюючи різні рівні архітектури, сервісний рівень взаємодіє з рішенням для зберігання даних за допомогою ORM/ODM. Однак у нашому прикладі нам не потрібно буде використовувати окрему ORM, оскільки Lowdb має вбудовану підтримку Javascript. Усі подробиці про його синтаксис можна знайти в документації.

Метод «createPost» отримує назву та порядок як параметри та використовує їх для створення об’єкта публікації. Для унікального ідентифікатора ми використовуємо спеціальну бібліотеку під назвою «nanoid», яка генерує унікальну послідовність символів. Ми додаємо нову публікацію в масив публікацій у базі даних і записуємо ці зміни; нова публікація потім повертається функцією.

Тепер, коли «createPost» готовий, функція додавання публікацій завершена та запущена. Ми тестуємо це за допомогою Postman, популярного інструменту для тестування API:

nodejs_7

Ми вибираємо «POST» як http-метод для запиту разом із указаним URL-шляхом «localhost:3000/posts». Додаємо заголовок і порядок у форматі json у розділі body та надсилаємо запит. Як показано вище, разом із новоствореною публікацією ми отримуємо статус 200 OK.

Висновок

У цьому проекті було досліджено багато концепцій та ідей: ми розповіли, як встановити та налаштувати середовище нашого проекту, навчилися налаштовувати LowDB для локального збереження даних, дослідили загальну архітектуру серверних програм NodeJS/Express і побачили, як застосувати це на простому прикладі. Нарешті, ми протестували нашу програму за допомогою Postman.

Мета полягала в тому, щоб показати спрощену версію всього, що входить у створення сучасних серверних програм. Як ми бачили раніше, NodeJs — це потужний інструмент, який дозволяє створювати прості та складні API. У поєднанні з його багатою екосистемою фреймворків, як-от express, і великою кількістю інструментів і бібліотек для майже будь-якого випадку використання, це законне рішення для сучасної бекенд-розробки – рішення, яке ми рекомендуємо вивчити та освоїти.


Career Services background pattern

Кар'єрні послуги

Contact Section background image

Давайте залишатися на зв'язку

Code Labs Academy © 2024 Всі права захищені.