1. Введение в бэкенд на Node.js: подключение и работа с драйверами баз данных
Введение в бэкенд на Node.js: подключение и работа с драйверами баз данных
Добро пожаловать в курс JavaScript и Базы Данных: Полное руководство. Это первая статья нашего цикла, и мы начнем с фундамента: как именно JavaScript, работающий на сервере (Node.js), общается с базами данных.
Многие начинающие разработчики представляют базу данных как «черный ящик», в который можно положить данные и забрать их обратно. Но как именно происходит этот процесс? Как код на JavaScript понимает, что нужно сделать SQL-серверу или кластеру MongoDB? Ответ кроется в понятии драйвер базы данных.
В этой статье мы разберем архитектуру взаимодействия, настроим первое подключение и научимся правильно управлять ресурсами.
Роль Node.js в современном бэкенде
Node.js — это среда выполнения JavaScript, построенная на движке V8 (том же, что используется в Google Chrome). Она позволяет запускать JavaScript вне браузера, то есть на сервере.
Главная особенность Node.js — это асинхронная модель ввода-вывода. Это означает, что Node.js не ждет завершения долгих операций (например, чтения файла или запроса к базе данных), а продолжает выполнять другой код, возвращаясь к результату позже. Это делает его идеальным инструментом для работы с базами данных, так как операции с БД — это, по сути, самые частые «долгие» операции в веб-приложениях.
Что такое драйвер базы данных?
Базы данных (PostgreSQL, MySQL, MongoDB, Redis) — это сложные самостоятельные программы. Они не понимают JavaScript. Они понимают свои собственные протоколы и языки запросов (например, SQL или бинарные протоколы).
Чтобы Node.js мог «поговорить» с базой данных, нужен посредник. Этим посредником выступает драйвер.
> Драйвер базы данных — это библиотека (npm-пакет), которая реализует протокол конкретной базы данных и предоставляет удобный API на JavaScript для взаимодействия с ней.
!Схема работы драйвера как переводчика между приложением и базой данных
Драйвер выполняет несколько критически важных функций:
Подготовка окружения
Прежде чем писать код, нам нужно инициализировать проект. Предполагается, что у вас уже установлен Node.js. Создайте папку для проекта и выполните команду:
Эта команда создаст файл package.json, который будет управлять зависимостями нашего проекта.
Подключение к реляционной базе данных (PostgreSQL)
В качестве примера реляционной базы данных мы будем использовать PostgreSQL. Самым популярным драйвером для неё в экосистеме Node.js является пакет pg.
Установим его:
Клиент vs Пул соединений
При работе с драйвером pg (и многими другими) есть два способа подключения: создание единичного Клиента (Client) или создание Пула (Pool).
* Client: Создает одно TCP-соединение. Подходит для редких скриптов или когда нужно держать постоянное соединение для специфических задач (например, LISTEN/NOTIFY).
* Pool: Создает набор соединений, которые переиспользуются. Это стандарт для веб-серверов. Открытие нового соединения — дорогая операция (занимает время и ресурсы процессора). Пул держит соединения открытыми и выдает их по запросу.
Рассмотрим пример подключения через Pool:
Обратите внимание на использование async/await. Работа с базой данных всегда асинхронна. Мы отправляем запрос по сети и ждем ответ. Использование await позволяет писать код линейно и понятно.
Подключение к NoSQL базе данных (MongoDB)
Теперь посмотрим, как это выглядит в мире NoSQL на примере MongoDB. Здесь мы используем официальный драйвер mongodb.
Установка:
В отличие от реляционных баз, где мы отправляем SQL-строки, драйвер MongoDB предоставляет методы, похожие на работу с объектами.
Здесь драйвер берет на себя всю работу по преобразованию JavaScript-объекта { a: 1 } в формат BSON (Binary JSON), который использует MongoDB внутри себя.
Безопасность: переменные окружения
В примерах выше мы писали пароли и адреса прямо в коде. Это категорически запрещено в реальных проектах. Если вы случайно отправите такой код в публичный репозиторий (например, на GitHub), злоумышленники получат доступ к вашей базе данных за считанные секунды.
Для хранения конфиденциальных данных используются переменные окружения.
В Node.js стандартом де-факто является библиотека dotenv.
npm install dotenv.env в корне проекта..env в .gitignore, чтобы он не попал в систему контроля версий.Пример файла .env:
Теперь модифицируем наш код подключения к PostgreSQL:
Теперь ваш код безопасен и гибок. Вы можете запускать одно и то же приложение на локальном компьютере и на боевом сервере, просто меняя файл .env.
Обработка ошибок
База данных — это внешняя система. Она может упасть, сеть может пропасть, пароль может измениться. Ваше приложение не должно «падать» молча.
Всегда оборачивайте вызовы к базе данных в блоки try...catch.
Заключение
Мы разобрали, как Node.js взаимодействует с базами данных через драйверы. Драйвер — это мост, который переводит ваши JavaScript-команды на язык базы данных. Мы научились подключаться к PostgreSQL и MongoDB, а также узнали, как делать это безопасно с помощью переменных окружения.
В следующих статьях курса мы углубимся в проектирование схем данных и написание сложных запросов.