前边我们用mysql和typeorm搭建了一个基本的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
| 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
| import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose' import { HydratedDocument } from 'mongoose'
export type CatDocument = HydratedDocument<Cat>
@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
| 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
| 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
|
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
|
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 } }
|