文档
目录
先理一下执行的顺序
dist 文件夹
nest 运行的是打包后的 dist 文件夹
src
main.ts
入口文件
//创建app应用,内容为AppModule
const app = await NestFactory.create(AppModule);
app.module.ts
//装饰器
@Module({
imports: [],
controllers: [AppController], //1.通过controllers加载进来
providers: [AppService], //2.运行
})
export class AppModule {} //AppModule使用装饰器装饰的
app.controller.ts
//装饰器
@Controller() //路由
export class AppController {
// 依赖注入的方式将AppService引入进来
constructor(private readonly appService: AppService) {}
@Get() //http的请求方法参数是地址
getHello(): string {
return this.appService.getHello(); //前面依赖注入的appService
}
}
app.service.ts
@Injectable()
export class AppService {
getHello(): string {
return "Hello World!";
}
}
模块
- providers 数据来源的、(service)
- controllers 处理业务的
- imports 引入第三方模块,如 mogndb,子模块
- exports 给别的模块提供服务
cli 指令(generate|g)
nest g mo|module name 生成 module nest g co|controller name 生成 controller nest g s|service name 生成 service
nest g res|resourse name 生成完整的模块 ... 其余使用 nest 命令看吧
swagger
const options = new DocumentBuilder() //编译
.setTitle("接口文档") //标题
.setDescription("描述") //描述
.setVersion("1.0") //版本
// .addTag('cats')//添加标签
.build(); //执行
const document = SwaggerModule.createDocument(app, options);
SwaggerModule.setup("docs", app, document); //docs为地址
模块标签
import { ApiTags } from '@nestjs/swagger';
@ApiTags("Video")
@Controller('video')
方法描述
@Post()
@ApiOperation({summary:'添加video'})
规定携带参数
@Post()
@ApiOperation({summary:'添加video'})
// @Body():装饰器,将body请求体的数据给createVideoDto上
create(@Body() createVideoDto: CreateVideoDto) {
return this.videoService.create(createVideoDto);
}
//CreateVideoDto
import { ApiProperty } from '@nestjs/swagger';
export class CreateVideoDto {
//配合swagger
@ApiProperty({ description: '邮箱', default: 'nameA@qq.com' })
readonly email: string;
@ApiProperty({ description: '密码' })
password: string;
@ApiProperty({ description: '用户名' })
readonly username: string;
@ApiProperty({ description: '手机号' })
readonly phone: string;
}
装饰器
@Controller() //对AppController类的说明,AppController类是专门作为Controller使用
export class AppController
依赖注入和 Providers
想依赖注入就得有个 Provider(提供者)
angular.cn/guide/depen… 想用一个类,正常情况下会引入然后 new,依赖注入就是直接拿过来用,不用 new,提供这个类的就是 providers
MongoDB
1.npm install --save @nestjs/mongoose mongoose 2. app.module.ts
@Module({
imports: [MongooseModule.forRoot('mongodb://localhost/nest')],
})
3.User 模块创建 Scheam 文件夹
//user.schema.ts
import { Schema, Prop, SchemaFactory } from "@nestjs/mongoose";
import { Document } from "mongoose";
export type UsersDocument = User & Document;
@Schema()
export class User extends Document {
@Prop({ required: true })
username: string;
@Prop({ required: true })
email: string;
@Prop({ required: true, select: false })
pasword: string;
@Prop({ required: true })
phone: string;
}
export const UserSchema = SchemaFactory.createForClass(User);
- User 模块引入
import { MongooseModule } from '@nestjs/mongoose'; import { User, UserSchema } from './schema/user.schema'; @Module({ imports: [ MongooseModule.forFeature([{ name: User.name, schema: UserSchema }])], - service 使用
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { UsersDocument, User } from './schema/user.schema';
constructor(
@InjectModel(User.name) private usersModel: Model<UsersDocument>,
) {
}
中间件
nets g mi logger
middle
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: any, res: any, next: () => void) {
console.log("nnnnnnnnnnnnnnnnnnn");
next();
}
}
使用
export class AppModule {
configure(consumer: MiddlewareConsumer) {
consumer
// consumer.apply(cors(), helmet(), logger).forRoutes(CatsController);
//控制器下面加就是控制器内所有请求
.apply(LoggerMiddleware, logger)
.exclude({ path: "/api/v1/list", method: RequestMethod.GET }) //忽略
.forRoutes(AppController, UserController); //路由
}
}
函数式中间件
// middle
export function logger(req, res, next) {
console.log(`Request...`);
next();
}
app.use(logger)
//或者
.apply(LoggerMiddleware, logger);
异常处理
管道(校验)
自定义管道
1. nest g pi xxx
$ npm install --save joi
$ npm install --save-dev @types/joi
//pipe
import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException } from '@nestjs/common';
import { ObjectSchema } from 'joi';
@Injectable()
export class JoiValidationPipe implements PipeTransform {
constructor(private schema: ObjectSchema) {}
//transform必须要有
transform(value: any, metadata: ArgumentMetadata) {
const { error } = this.schema.validate(value);
if (error) {
throw new BadRequestException('Validation failed');
}
return value;
}
}
//使用
const Joi = require('joi')
@Post()
@UsePipes(new JoiValidationPipe( Joi.object({
username: Joi.string().required(),
password: Joi.string().min(3).max(20).required(),
email: Joi.string().email().required(),
phone: Joi.string().required(),
}),))
async create(@Body() createCatDto: CreateCatDto) {
this.catsService.create(createCatDto);
}
守卫
nest g gu auth
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Observable } from 'rxjs';
@Injectable()
export class AuthGuard implements CanActivate {
canActivate(
context: ExecutionContext,
): boolean | Promise<boolean> | Observable<boolean> {
console.log('token',context.switchToHttp().getRequest().rawHeaders[1]);
console.log('url',context.switchToHttp().getRequest()._parsedUrl);
return true;
}
}
//使用
@Controller('cats') | @Post()
@UseGuards(RolesGuard)
app.useGlobalGuards(new RolesGuard());