返回
NestJS MongoDB 应用指南:构建完整 CRUD API
前端
2023-12-14 06:48:56
前言
在本文中,我们将以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 数据库。希望本教程对您有所帮助,如果您有任何问题或建议,欢迎随时与我联系。