Nestjs Mongoose使用 (附加@nestjs/swagger使用)
一开始并没有使用官方给出的mongoose包,而是使用了typegoose。
####首先要创建一个项目 然后见一个文件夹这里我的是posts然后创建好mvc
//PostsModule.ts 这个是最后结合mongoose的一个 解藕性很好的一个版本
//(什么是解耦:模块一的实现依赖于模块二,更改模块二后,模块一也得更改,那么二者就有耦合。
//修改程序,使得更改模块二后,模块一不受影响,那么就叫解藕)
import { Module } from '@nestjs/common';
import { TypegooseModule } from 'nestjs-typegoose';
import { Post } from './post.module';
import { PostsController } from './posts.controller';
import { PostsService } from './posts.service';
@Module({
imports:[
TypegooseModule.forFeature([Post])//通过forFeature去导入使用的模型,数组的原因是可能用到多个模型
],
controllers:[PostsController],
providers:[PostsService]
})
export class PostsModule {}
//post.ts , 一个定义好的模型
import {prop } from '@hasezoey/typegoose';
export class Post{
@prop()
title: string;
@prop()
content: string;
}
import { Injectable, Body, Response, Param } from '@nestjs/common';
import { ApiModelProperty } from '@nestjs/swagger';
import { IsNotEmpty } from 'class-validator';
import { Post} from './post.module';
import { InjectModel } from 'nestjs-typegoose';
export class CreatPostsDto {
//这是引用了@nestjs/swagger去定义一些东西
@ApiModelProperty({ description: 'xxx', example: 'xxxx' })
@IsNotEmpty({ message: 'xxx' })
title: string;
@ApiModelProperty({ description: 'xxx', example: 'xxxx' })
content: string;
}
@Injectable()
export class PostsService {
//使用nestjs-typegoose的InjectModel不要使用mongoose的 去导入Post。
constructor(@InjectModel(Post) private readonly postModule) {}
//这是一个查询方法是这个包@hasezoey/typegoose里的查询方法
async fidAll(@Response() res) {
return await this.postModule.find().then(rtn => {
res.json({ rtn: rtn });
});
}
}
}
//PostsController.ts 这个应该都看的懂!
import { Controller, Get, Post, Response, Body, Put, Delete, Param } from '@nestjs/common';
import { ApiUseTags, ApiOperation, } from '@nestjs/swagger';
import { PostsService } from './posts.service';
import {CreatPostsDto} from './posts.service';
@Controller('posts')
//还是使用的@nestjs/swagger
@ApiUseTags('帖子')
export class PostsController {
constructor(private readonly PostsService:PostsService){}
@Get()
@ApiOperation({title:'显示'})
async index(@Response() res){
return await this.PostsService.fidAll(res);
}
}
然后还需要链接数据库
//这是app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TypegooseModule } from 'nestjs-typegoose';
import { PostsModule } from './posts/posts.module';
@Module({
imports: [
//使用nestjs-typegoose里的TypegooseModule.forRoot去链接数据库
TypegooseModule.forRoot("mongodb://localhost:27017/blog", {
useNewUrlParser: true
}),
PostsModule
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
最后附上main.ts配置
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
import { ValidationPipe } from '@nestjs/common';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new ValidationPipe())
const options = new DocumentBuilder()
.setTitle('Cats example')
.setDescription('The cats API description')
.setVersion('1.0')
.addTag('cats')
.build();
const document = SwaggerModule.createDocument(app, options);
SwaggerModule.setup('api-docs', app, document);
await app.listen(3000);
}
bootstrap();
因为官方文档的mongoose很复杂最后使用的typegoose,然后现在新版本的发布使得解耦性很好写法和mongoose近似非常好使!!!!