返回

NestJS MongoDB 应用指南:构建完整 CRUD API

前端

前言

在本文中,我们将以NestJS框架为例,构建一个完整的MongoDB应用,涵盖从安装MongoDB到构建CRUD API的所有步骤。我们将使用Mongoose ORM和MongoDB Atlas来轻松地管理我们的MongoDB数据库。

初始化

# 创建 NestJS 项目
npx create-nest-app nestjs-mongo

# 安装 MongoDB 驱动程序
npm install --save mongodb

连接 MongoDB

// src/database/mongodb.service.ts
import { Injectable } from '@nestjs/common';
import { MongoClient } from 'mongodb';
import { ConfigService } from '@nestjs/config';

@Injectable()
export class MongoDBService {
  private client: MongoClient;

  constructor(private configService: ConfigService) {}

  async connect() {
    const uri = this.configService.get('MONGODB_URI');
    this.client = await MongoClient.connect(uri, {
      useNewUrlParser: true,
      useUnifiedTopology: true,
    });
  }

  async disconnect() {
    await this.client.close();
  }

  async getCollection(collectionName: string) {
    return this.client.db().collection(collectionName);
  }
}

构建 CRUD API

创建实体

// src/schemas/user.schema.ts
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { Document } from 'mongoose';

export type UserDocument = User & Document;

@Schema()
export class User {
  @Prop()
  name: string;

  @Prop()
  email: string;
}

export const UserSchema = SchemaFactory.createForClass(User);

创建数据传输对象 (DTO)

// src/dto/create-user.dto.ts
import { IsEmail, IsNotEmpty, IsString } from 'class-validator';

export class CreateUserDto {
  @IsNotEmpty()
  @IsString()
  name: string;

  @IsNotEmpty()
  @IsEmail()
  email: string;
}

创建服务

// src/services/user.service.ts
import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { CreateUserDto } from '../dto/create-user.dto';
import { User, UserDocument } from '../schemas/user.schema';

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

  async create(createUserDto: CreateUserDto): Promise<User> {
    const createdUser = new this.userModel(createUserDto);
    return createdUser.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, createUserDto: CreateUserDto): Promise<User> {
    return this.userModel.findByIdAndUpdate(id, createUserDto, { new: true }).exec();
  }

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

创建控制器

// src/controllers/user.controller.ts
import { Controller, Get, Post, Put, Delete, Param, Body } from '@nestjs/common';
import { UserService } from '../services/user.service';
import { CreateUserDto } from '../dto/create-user.dto';
import { User } from '../schemas/user.schema';

@Controller('users')
export class UserController {
  constructor(private readonly userService: UserService) {}

  @Post()
  async create(@Body() createUserDto: CreateUserDto): Promise<User> {
    return this.userService.create(createUserDto);
  }

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

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

  @Put(':id')
  async update(@Param('id') id: string, @Body() createUserDto: CreateUserDto): Promise<User> {
    return this.userService.update(id, createUserDto);
  }

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

配置模块

// src/app.module.ts
import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import { UserService } from './services/user.service';
import { UserController } from './controllers/user.controller';
import { User, UserSchema } from './schemas/user.schema';
import { MongoDBService } from './database/mongodb.service';

@Module({
  imports: [
    MongooseModule.forRootAsync({
      useFactory: async (configService: ConfigService) => ({
        uri: configService.get('MONGODB_URI'),
        useNewUrlParser: true,
        useUnifiedTopology: true,
      }),
      inject: [ConfigService],
    }),
    MongooseModule.forFeature([{ name: User.name, schema: UserSchema }]),
  ],
  providers: [UserService, MongoDBService],
  controllers: [UserController],
})
export class AppModule {}

运行应用

npm run start:dev

结论

通过本教程,您已经成功构建了一个完整的 NestJS MongoDB 应用,涵盖从安装 MongoDB 到构建 CRUD API 的所有步骤。您还学习了如何使用 Mongoose ORM 和 MongoDB Atlas 来轻松地管理您的 MongoDB 数据库。希望本教程对您有所帮助,如果您有任何问题或建议,欢迎随时与我联系。