Как подключить и использовать MongoDB в приложении Nest.js

среда, 25 декабря 2024 г.

MongoDB — одна из самых популярных NoSQL баз данных, а в сочетании с Mongoose она отлично подходит для приложений на Nest.js. В этой статье мы разберёмся, как подключить MongoDB к приложению Nest.js, настроить модели, создать CRUD-операции и использовать их в контроллерах.

Шаг 1: Установка необходимых пакетов
Для работы с MongoDB в Nest.js используется библиотека @nestjs/mongoose, которая интегрируется с Mongoose. Установим необходимые зависимости:

npm install @nestjs/mongoose mongoose
npm install --save-dev @types/mongoose

Шаг 2: Подключение к базе данных
В AppModule подключаем MongoDB с помощью MongooseModule:

import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';

@Module({
  imports: [
    MongooseModule.forRoot('mongodb://localhost:27017/nest-app', {
      useNewUrlParser: true,
      useUnifiedTopology: true,
    }),
  ],
})
export class AppModule {}

Замените mongodb://localhost:27017/nest-app на строку подключения к вашей базе данных.

Шаг 3: Создание модели и схемы
Создадим сущность, например, для работы с пользователями.
1. Сгенерируем модуль и сервис:

nest g module users
nest g service users
nest g controller users

2. Создадим схему пользователя:
В users/schemas/user.schema.ts:

import { Schema, Prop, SchemaFactory } from '@nestjs/mongoose';
import { Document } from 'mongoose';

@Schema()
export class User extends Document {
  @Prop({ required: true })
  name: string;

  @Prop({ required: true, unique: true })
  email: string;

  @Prop({ default: Date.now })
  createdAt: Date;
}

export const UserSchema = SchemaFactory.createForClass(User);

3. Подключим схему в модуле:
В users/users.module.ts:

import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import { UsersService } from './users.service';
import { UsersController } from './users.controller';
import { User, UserSchema } from './schemas/user.schema';

@Module({
  imports: [
    MongooseModule.forFeature([{ name: User.name, schema: UserSchema }]),
  ],
  providers: [UsersService],
  controllers: [UsersController],
})
export class UsersModule {}

Шаг 4: Реализация CRUD-операций
Сервис для взаимодействия с базой данных
В users/users.service.ts:

import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { User } from './schemas/user.schema';

@Injectable()
export class UsersService {
  constructor(@InjectModel(User.name) private userModel: Model<User>) {}

  async create(createUserDto: { name: string; email: string }): Promise<User> {
    const user = new this.userModel(createUserDto);
    return user.save();
  }

  async findAll(): Promise<User[]> {
    return this.userModel.find().exec();
  }

  async findOne(id: string): Promise<User> {
    return this.userModel.findById(id).exec();
  }

  async update(id: string, updateUserDto: Partial<User>): Promise<User> {
    return this.userModel.findByIdAndUpdate(id, updateUserDto, { new: true }).exec();
  }

  async delete(id: string): Promise<User> {
    return this.userModel.findByIdAndRemove(id).exec();
  }
}

Контроллер для обработки запросов
В users/users.controller.ts:

import { Controller, Get, Post, Body, Param, Patch, Delete } from '@nestjs/common';
import { UsersService } from './users.service';
import { User } from './schemas/user.schema';

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Post()
  async create(@Body() createUserDto: { name: string; email: string }): Promise<User> {
    return this.usersService.create(createUserDto);
  }

  @Get()
  async findAll(): Promise<User[]> {
    return this.usersService.findAll();
  }

  @Get(':id')
  async findOne(@Param('id') id: string): Promise<User> {
    return this.usersService.findOne(id);
  }

  @Patch(':id')
  async update(@Param('id') id: string, @Body() updateUserDto: Partial<User>): Promise<User> {
    return this.usersService.update(id, updateUserDto);
  }

  @Delete(':id')
  async delete(@Param('id') id: string): Promise<User> {
    return this.usersService.delete(id);
  }
}

Шаг 5: Тестирование
Теперь ваше приложение готово к работе с MongoDB. Вы можете использовать Postman, Curl или любую другую утилиту для отправки запросов:
1. Создать пользователя:

POST /users
Content-Type: application/json

{
  "name": "John Doe",
  "email": "john@example.com"
}

2. Получить всех пользователей:

GET /users

3. Обновить пользователя:

PATCH /users/<id>
Content-Type: application/json

{
  "name": "Jane Doe"
}

4. Удалить пользователя:

DELETE /users/<id>

MongoDB в связке с Mongoose и Nest.js позволяет быстро и эффективно разрабатывать серверные приложения с гибкой работой с данными. Используя описанную структуру, вы можете легко масштабировать приложение и добавлять новые сущности.


Fullstack-разработчик в Москве
Александр
Fullstack-разработчик в Москве

Профессиональная разработка веб-приложений на Node.js с использованием современных frontend и backend фреймворков. Создание, продвижение, поддержка и обслуживание сайтов. Эффективно, прибыльно.