Nestjs基于Mongodb的简单CRUD搭建

前边我们用mysqltypeorm搭建了一个基本的CRUD结构,考虑到有些朋友是使用mongodb开发的,所以我们本次用mongoose配合nestjs搭建一个基本的CRUD

nestjs的一些基础操作在mysql那一节已经说过了,这里就直接跳过了哦

引入mongoose

安装依赖:

1
npm i @nestjs/mongoose mongoose

app.module.ts引入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// app.module.ts
import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';

@Module({
imports: [
MongooseModule.forRoot(
'mongodb://username:password@HOST:PORT',
{
dbName: 'db_name',
},
),
],
})
export class AppModule {}

不知道为何,数据库名拼接在URI上总是连不上,通过options配置就能连接了。

这次我们不用上次的books目录了,通过nest g res cats创建一个新的模块进行开发。

创建schema

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// cat.schema.ts
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'
import { HydratedDocument } from 'mongoose'

export type CatDocument = HydratedDocument<Cat>

@Schema() // @Schema标记类为一个Schema
export class Cat {
@Prop({ required: true })
name: string

@Prop()
age: number

@Prop()
breed: string

@Prop([String]) // 复杂类型无法自动推断则需要指定
tags: string[]
}

export const CatSchema = SchemaFactory.createForClass(Cat)

cats.module.ts中引入:

1
2
3
4
5
6
7
8
9
10
11
12
13
// cats.module.ts
import { Module } from '@nestjs/common'
import { MongooseModule } from '@nestjs/mongoose'
import { CatsService } from './cats.service'
import { CatsController } from './cats.controller'
import { Cat, CatSchema } from './schemas/cat.schema'
@Module({
imports: [MongooseModule.forFeature([{ name: Cat.name, schema: CatSchema }])],
controllers: [CatsController],
providers: [CatsService],
})
export class CatsModule {}

现在就可以在cats.service.ts中注册使用了

1
2
3
4
5
6
7
8
9
10
11
12
// cats.service.ts
import { Injectable } from '@nestjs/common'
import { CreateCatDto } from './dto/create-cat.dto'
import { UpdateCatDto } from './dto/update-cat.dto'
import { InjectModel } from '@nestjs/mongoose'
import { Cat, CatDocument } from './schemas/cat.schema'
import { Model } from 'mongoose'
@Injectable()
export class CatsService {
constructor(@InjectModel(Cat.name) private catModel: Model<CatDocument>) {}
}

CRUD实现

这里直接放代码了,与mysql的差不多,真正的差异也是typeorm和mongoose,不在这里讲这个。

dto的代码不放了,大家自己创建即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// cats.controller.ts

import { Controller, Get, Post, Body, Param } from '@nestjs/common'
import { CatsService } from './cats.service'
import { CreateCatDto } from './dto/create-cat.dto'
import { UpdateCatDto } from './dto/update-cat.dto'

@Controller('cats')
export class CatsController {
constructor(private readonly catsService: CatsService) {}

@Post('create')
createCat(@Body() createCatDto: CreateCatDto) {
return this.catsService.createCat(createCatDto)
}

@Post('update')
updateCat(@Body() updateCatDto: UpdateCatDto) {
return this.catsService.updateCat(updateCatDto)
}

@Get('findAll')
findAllCat() {
return this.catsService.findAllCat()
}

@Get('findOne/:id')
findOneCat(@Param('id') id: string) {
return this.catsService.findOneCat(id)
}

@Get('delete/:id')
deleteCat(@Param('id') id: string) {
return this.catsService.deleteCat(id)
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// cats.service.ts

import { Injectable } from '@nestjs/common'
import { CreateCatDto } from './dto/create-cat.dto'
import { UpdateCatDto } from './dto/update-cat.dto'
import { InjectModel } from '@nestjs/mongoose'
import { Cat, CatDocument } from './schemas/cat.schema'
import { Model } from 'mongoose'
@Injectable()
export class CatsService {
constructor(@InjectModel(Cat.name) private catModel: Model<CatDocument>) {}

createCat(createCatDto: CreateCatDto): Promise<Cat> {
const createdCat = new this.catModel(createCatDto)
return createdCat.save()
}

async updateCat(updateCatDto: UpdateCatDto): Promise<Cat> {
const updatedRes = await this.catModel.findByIdAndUpdate(updateCatDto.id, {
$set: { name: updateCatDto.name, age: updateCatDto.age },
})
return updatedRes
}

async findAllCat(): Promise<Cat[]> {
const res = await this.catModel.find().exec()
return res
}

async findOneCat(id: string): Promise<Cat> {
const res = await this.catModel.findById(id).exec()
return res
}

async deleteCat(id: string) {
const res = await this.catModel.findByIdAndDelete(id)
return res
}
}

作者

胡兆磊

发布于

2023-02-18

更新于

2023-02-18

许可协议