Работа с базами данных в TypeScript: PostgreSQL и MongoDB для начинающих
TypeScript — это строго типизированное расширение JavaScript, которое добавляет в код надежность и предсказуемость. При работе с базами данных (БД) TypeScript особенно полезен: вы можете определять типы для сущностей, проверять корректность запросов на этапе компиляции и избегать множества runtime-ошибок. В этой статье мы рассмотрим, как подключаться к двум самым популярным базам данных — реляционной PostgreSQL и документоориентированной MongoDB — и выполнять базовые операции с данными. Материал ориентирован на начинающих разработчиков, знакомых с основами TypeScript.
Подготовка окружения и установка зависимостей
Прежде чем писать код, необходимо настроить проект. Создайте новую директорию и инициализируйте проект:
mkdir ts-db-example
cd ts-db-example
npm init -y
npm install typescript @types/node ts-node --save-dev
npx tsc --init
Теперь установим библиотеки для работы с базами данных. Для PostgreSQL мы будем использовать TypeORM (популярный ORM с хорошей поддержкой TypeScript), а для MongoDB — Mongoose (библиотека для моделирования схем и работы с MongoDB).
npm install typeorm reflect-metadata pg
npm install mongoose
Также установим типы для Node.js и настройки для TypeORM:
npm install @types/node --save-dev
В файле tsconfig.json обязательно включите опции:
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true,
"experimentalDecorators": true,
"emitDecoratorMetadata": true
}
}
Теперь структура проекта готова. Создайте папку src и внутри неё файлы для работы с каждой БД.
Работа с PostgreSQL через TypeORM
Настройка подключения
TypeORM позволяет работать с БД через декораторы и сущности. Создадим файл src/postgres.ts и настроим подключение к локальной PostgreSQL базе данных ts_db:
import "reflect-metadata";
import { DataSource } from "typeorm";
export const AppDataSource = new DataSource({
type: "postgres",
host: "localhost",
port: 5432,
username: "postgres",
password: "password",
database: "ts_db",
synchronize: true, // автоматически создаёт таблицы (только для разработки)
logging: false,
entities: ["src/entity/**/*.ts"],
});
Создание сущности (Entity)
Сущность — это класс, который маппится на таблицу в БД. Создадим папку src/entity и файл User.ts:
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column({ length: 100 })
name: string;
@Column({ unique: true })
email: string;
@Column({ default: 18 })
age: number;
}
Выполнение CRUD-операций
Теперь напишем функции для создания, чтения, обновления и удаления пользователей в файле src/postgres-crud.ts:
import { AppDataSource } from "./postgres";
import { User } from "./entity/User";
async function main() {
await AppDataSource.initialize();
const userRepository = AppDataSource.getRepository(User);
// CREATE — создание нового пользователя
const newUser = userRepository.create({
name: "Иван Петров",
email: "ivan@example.com",
age: 25,
});
await userRepository.save(newUser);
console.log("Пользователь создан:", newUser);
// READ — чтение всех пользователей
const allUsers = await userRepository.find();
console.log("Все пользователи:", allUsers);
// UPDATE — обновление возраста пользователя с id=1
const userToUpdate = await userRepository.findOneBy({ id: 1 });
if (userToUpdate) {
userToUpdate.age = 30;
await userRepository.save(userToUpdate);
console.log("Пользователь обновлён:", userToUpdate);
}
// DELETE — удаление пользователя с id=1
await userRepository.delete(1);
console.log("Пользователь удалён");
}
main().catch(err => console.error(err));
Запустите скрипт командой npx ts-node src/postgres-crud.ts. TypeORM автоматически создаст таблицу user и выполнит все операции.
Работа с MongoDB через Mongoose
Настройка подключения
Mongoose предоставляет удобный API для работы с MongoDB. Создадим файл src/mongodb.ts:
import mongoose from "mongoose";
const MONGODB_URI = "mongodb://localhost:27017/ts_mongo_db";
export async function connectToMongo() {
try {
await mongoose.connect(MONGODB_URI);
console.log("Подключено к MongoDB");
} catch (error) {
console.error("Ошибка подключения:", error);
process.exit(1);
}
}
Определение схемы и модели
В MongoDB данные хранятся в виде документов. Создадим модель пользователя в файле src/models/User.ts:
import mongoose, { Schema, Document } from "mongoose";
// Интерфейс для TypeScript
export interface IUser extends Document {
name: string;
email: string;
age: number;
createdAt: Date;
}
// Схема Mongoose
const UserSchema: Schema = new Schema({
name: { type: String, required: true },
email: { type: String, required: true, unique: true },
age: { type: Number, default: 18 },
createdAt: { type: Date, default: Date.now },
});
export const UserModel = mongoose.model<IUser>("User", UserSchema);
Выполнение CRUD-операций
Теперь напишем скрипт для работы с MongoDB в файле src/mongodb-crud.ts:
import { connectToMongo } from "./mongodb";
import { UserModel } from "./models/User";
async function main() {
await connectToMongo();
// CREATE — создание пользователя
const newUser = new UserModel({
name: "Мария Смирнова",
email: "maria@example.com",
age: 22,
});
await newUser.save();
console.log("Пользователь создан:", newUser);
// READ — получение всех пользователей
const allUsers = await UserModel.find();
console.log("Все пользователи:", allUsers);
// UPDATE — обновление возраста по email
const updatedUser = await UserModel.findOneAndUpdate(
{ email: "maria@example.com" },