Работа с базами данных в JavaScript (Node.js): PostgreSQL и MongoDB для начинающих
При разработке веб-приложений на JavaScript (Node.js) почти всегда требуется сохранять данные: пользователей, заказы, статьи или логи. Для этого используются базы данных (БД). В этом руководстве мы разберём две самые популярные системы: реляционную PostgreSQL и документо-ориентированную MongoDB. Вы узнаете, как подключиться к ним из Node.js и выполнять базовые CRUD-операции (создание, чтение, обновление, удаление).
Статья рассчитана на начинающих разработчиков, знакомых с основами JavaScript. Все примеры кода можно запустить в вашем проекте.
1. PostgreSQL: реляционная база данных
PostgreSQL — мощная SQL-база данных, где данные хранятся в таблицах со строгими типами полей. Для работы с ней в Node.js мы будем использовать пакет pg.
1.1. Установка и подключение
Сначала установите пакет через npm:
npm install pg
Создайте файл db.js и настройте подключение к локальной БД:
const { Pool } = require('pg');
const pool = new Pool({
user: 'postgres',
host: 'localhost',
database: 'mydb',
password: 'password',
port: 5432,
});
module.exports = pool;
1.2. Создание таблицы и CRUD-операции
Для начала создадим таблицу users с полями id, name и email. Затем выполним все базовые операции.
const pool = require('./db');
// Создание таблицы
async function createTable() {
await pool.query(`
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL
);
`);
console.log('Таблица users создана');
}
// Вставка данных (CREATE)
async function addUser(name, email) {
const result = await pool.query(
'INSERT INTO users (name, email) VALUES ($1, $2) RETURNING *',
[name, email]
);
return result.rows[0];
}
// Чтение данных (READ)
async function getUsers() {
const result = await pool.query('SELECT * FROM users');
return result.rows;
}
// Обновление данных (UPDATE)
async function updateUser(id, name) {
const result = await pool.query(
'UPDATE users SET name = $1 WHERE id = $2 RETURNING *',
[name, id]
);
return result.rows[0];
}
// Удаление данных (DELETE)
async function deleteUser(id) {
await pool.query('DELETE FROM users WHERE id = $1', [id]);
console.log('Пользователь удалён');
}
// Пример использования
(async () => {
await createTable();
const newUser = await addUser('Иван', 'ivan@example.com');
console.log('Добавлен:', newUser);
const users = await getUsers();
console.log('Все пользователи:', users);
await updateUser(1, 'Пётр');
await deleteUser(2);
})();
Важно: Всегда используйте параметризованные запросы (через $1, $2), чтобы избежать SQL-инъекций.
2. MongoDB: NoSQL база данных
MongoDB хранит данные в формате JSON-подобных документов (BSON). Для Node.js используется официальный драйвер mongodb или популярная библиотека mongoose. В этом примере мы воспользуемся драйвером.
2.1. Установка и подключение
npm install mongodb
Подключение к локальной MongoDB (по умолчанию порт 27017):
const { MongoClient } = require('mongodb');
const uri = 'mongodb://localhost:27017';
const client = new MongoClient(uri);
async function connect() {
await client.connect();
console.log('Подключено к MongoDB');
return client.db('mydb'); // база данных mydb
}
module.exports = { connect, client };
2.2. CRUD-операции с коллекцией
В MongoDB таблицы называются коллекциями, а строки — документами. Создадим коллекцию users и выполним операции.
const { connect } = require('./mongo');
async function crudMongo() {
const db = await connect();
const collection = db.collection('users');
// CREATE: вставка документа
const insertResult = await collection.insertOne({
name: 'Анна',
email: 'anna@example.com',
age: 25
});
console.log('Вставлен документ:', insertResult.insertedId);
// READ: поиск всех документов
const allUsers = await collection.find({}).toArray();
console.log('Все пользователи:', allUsers);
// UPDATE: обновление по имени
await collection.updateOne(
{ name: 'Анна' },
{ $set: { age: 26 } }
);
console.log('Возраст обновлён');
// DELETE: удаление по email
await collection.deleteOne({ email: 'anna@example.com' });
console.log('Документ удалён');
}
crudMongo().catch(console.error);
В MongoDB нет строгой схемы — вы можете добавлять поля на лету. Например, следующий документ будет принят без проблем:
{ name: 'Олег', email: 'oleg@example.com', phone: '+79991234567' }
3. PostgreSQL vs MongoDB: когда что выбирать?
Выбор между SQL и NoSQL зависит от задачи. Вот ключевые различия:
- PostgreSQL — строгая структура, поддержка JOIN, транзакций и сложных запросов. Идеально для финансовых систем, интернет-магазинов, где важна целостность данных.
- MongoDB — гибкая схема, высокая скорость записи, удобна для JSON-данных. Подходит для блогов, чатов, систем аналитики, где структура часто меняется.
Для начинающих совет: начните с PostgreSQL, чтобы понять принципы SQL и нормализации. Затем попробуйте MongoDB для проектов, где важна скорость разработки.
4. Практический совет: использование переменных окружения
Никогда не храните пароли и URI в коде. Используйте файл .env и пакет dotenv:
npm install dotenv
Создайте файл .env:
PG_USER=postgres
PG_PASSWORD=secret
MONGO_URI=mongodb://localhost:27017/mydb
В коде подключайте конфигурацию так:
require('dotenv').config();
const pool = new Pool({
user: