Базы данных
Тема дорожной карты · Node.js
Серверные приложения Node.js подключаются к базам данных с помощью официальных пакетов-драйверов или ORM более высокого уровня, доступных через npm. Для реляционных баз данных, таких как PostgreSQL или MySQL, популярные npm-пакеты pg или mysql2 предоставляют API на основе Promise, естественно интегрирующийся с асинхронным кодом Node.js. При работе с NoSQL-хранилищами такие пакеты, как mongoose, предлагают основанную на схемах абстракцию поверх MongoDB, упрощающую моделирование данных на JavaScript. Node.js хорошо подходит для рабочих нагрузок с интенсивной работой с базами данных, поскольку его неблокирующая I/O-модель позволяет выполнять множество конкурентных запросов к базе данных без остановки цикла событий. Выбор подходящего драйвера базы данных и понимание принципов пула соединений — ключевые шаги в построении производительного серверного приложения Node.js, способного масштабироваться под реальной нагрузкой.
Как это работает
Базы данных использует driver-библиотеки: pg — для PostgreSQL, mysql2 — для MySQL, better-sqlite3 — для SQLite (sync API, быстрый), mongodb — для MongoDB, redis/ioredis — для Redis. ORM сверху: Prisma (TypeScript-first, schema-based), Drizzle (TS-типизированный SQL DSL), Sequelize (зрелый классический), TypeORM (декораторный). Connection pooling важен в production — никогда не открывайте соединение на запрос без pool.
Когда применять
Prisma или Drizzle — для новых TypeScript-проектов: type-safety + миграции чисто интегрированы. Сырой pg + SQL — когда запросы тонко настроены или ORM мешает. SQLite (better-sqlite3) — для маленьких single-host приложений и embedded; удивительно мощный, проще в эксплуатации. Миграции всегда через тул (Prisma migrate, drizzle-kit, knex); не правьте production-схему руками.
Типичные ошибки
Ловушки Базы данных: SQL-инъекции из конкатенации строк (параметризованные запросы — есть у каждого драйвера); утечка соединений (важны размер pool + idle timeout); N+1 запросов от наивного ORM (eager-load явно); транзакции, оставленные открытыми из-за early return (async + try/finally); долгие запросы держат row-локи. Slow-query логирование — с самого начала.