使用nestjs/cli创建nest.js新项目
1.安装nest.js脚手架并新建项目
npm i -g nestjs/cli
nest new project-name2.安装和配置typeorm
npm install @nestjs/typeorm typeorm mysql2在 /src/app.module.ts 文件中进行配置
import { TypeOrmModule } from '@nestjs/typeorm';...imports: [TypeOrmModule.forRoot({type: 'mysql',host: 'localhost',port: 3306,username: 'user',password: '123456',database: 'dbname',autoLoadEntities: true,synchronize: true,dateStrings: true
})]...3.在main.ts中配置CORS
const app = await NestFactory.create(AppModule);app.enableCors({origin: ['http://localhost:5137'],credentials: true
})4.配置ConfigModule
安装
npm install @nestjs/config在app.module.ts文件中配置
import {ConfigModule} from '@nestjs/config'@Module({imports: [//config moduleConfigModule.forRoot({isGlobal: true, // 全局注册envFilePath: '.env' //加载env文件})]
})
在根目录创建.env文件,内容如下:
JWT_SECRET=4UZ7JD34HF9835.安装配置express-session
npm i express-session
npm i -D @types/express-session在main.ts中配置
import session from 'express-session'app.use(session({secret: 'secret_str',resave: false,saveUninitialized: false,rolling: true,cookie: {httpOnly: true,maxAge: 3600000,secure: false}
}))用法
import {Session} from '@nestjs/common'@Get()
findAll(@Session() session: any) {session.xxx = 'enabled'const value = session.xxx
}6.配置jwt的签发与验证
安装相关依赖包
npm i @nestjs/passport passport passport-local passport-jwt
npm i -D @types/passport-local @types/passport-jwt在src中新建auth文件夹,并在文件夹中新建jwt.strategy.ts文件
import { ExtractJwt, Strategy } from "passport-jwt";
import { PassportStrategy } from '@nestjs/passport'
import { Injectable } from '@nestjs/common'
import { ConfigService } from "@nestjs/config";@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') {constructor(private configService: ConfigService) {super({jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), // 指定从header中的bearer中提取tokenignoreExpiration: false, // 自动处理过期请求secretOrKey: configService.get<string>('JWT_SECRET')! //签名私钥})}// 返回jwt中的信息async validate(payload:any) {return payload}
}src/app.module.ts中添加以下代码
import { JwtStrategy } from './auth/jwt.strategy'providers: [AppService, JwtStrategy]签发部分(service)
import { JwtService } from "@nestjs/jwt/dist"export class PassportService {constructor(private readonly jwtService: JwtService) { }login() {// ... 登录逻辑const loginInfo = {}// 签发tokenloginInfo.token = this.jwtService.sign({loginInfo})return loginInfo }}签发部分(module)
import { Module } from "@nestjs/common";
import { PassportController } from "./passport.controller";
import { PassportService } from "./passport.service";
import { JwtModule } from "@nestjs/jwt/dist/jwt.module";
@Module({imports: [JwtModule.register({secret: 'P@ssp0rt20HJ21@@$$', // 私钥signOptions: { expiresIn: '6h'} //过期时间})],controllers: [PassportController],providers: [PassportService]
})验证部分(Controller)
import {Controller,Get, UseGuards, Req} from '@nestjs/common'
import { AuthGuard } from '@nestjs/passport'@Controller('passport')
@UseGuards(AuthGuard('jwt')) // 当前controller所有接口都验证
export class PassportController {constructor(private readonly PassportService: PassportService) {}@UseGuards(AuthGuard('jwt')) // 单个接口验证@Get()findAll(@Req() req):any {console.log(req.user) // 提取jwt中保存的数据return this.PassportService.findAll()}}7.Response拦截器
在src目录下新建interceptor文件夹,并在文件夹中新建response.interceptor.ts文件,代码:
import {Injectable, NestInterceptor, CallHandler, ExecutionContext} from '@nestjs/common'
import {map} from 'rxjs/operators'
import {Observable} from 'rxjs'interface Response<T> {data: T
}@Injectable()
export class ResponseInterceptor<T> implements NestInterceptor<T, Response<T>> {intercept(context: ExecutionContext, next: CallHandler<T>):Observable<Response<T>> {return next.handle().pipe(map(data=> {return {data,code: 0,message: '请求成功'}}))}
}在main.ts中配置
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ResponseInterceptor } from './interceptor/response.interceptor';async function bootstrap() {const app = await NestFactory.create(AppModule);app.useGlobalInterceptors(new ResponseInterceptor()) // 添加拦截器await app.listen(5200);
}
bootstrap();8.配置 DTO validator
安装依赖
npm install --save class-validator class-transformer在main.ts中用pipe来配置
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ValidationPipe } from '@nestjs/common';async function bootstrap() {const app = await NestFactory.create(AppModule);app.useGlobalPipes(new ValidationPipe({ // 验证管道whitelist: true,forbidNonWhitelisted: true // 白名单之外的参数报错}))await app.listen(5200);
}
bootstrap();9.配置静态资源访问通道
在main.ts中配置
import { NestExpressApplication } from '@nestjs/platform-express';
const app = await NestFactory.create<NestExpressApplication>(AppModule);
app.useStaticAssets('uploads', {prefix: '/uploads'})10.配置上传文件功能
npm install multer
npm install -D @types/multersrc下新建upload文件夹,文夹中新建upload.module.ts和upload.controller.ts文件
upload.module.ts
import { Module } from "@nestjs/common";
import { MulterModule } from "@nestjs/platform-express";
import { UploadController } from "./upload.controller";
import { diskStorage } from 'multer'
import {extname} from 'path'@Module({imports: [MulterModule.register({storage: diskStorage({//文件储存位置destination: 'uploads/' + new Date().getFullYear()+'/' + Number(new Date().getMonth()+1),//文件名定制filename: (req, file, callback) => {const path = Date.now() + '-' + Math.round(Math.random() * 1e10) + extname(file.originalname)callback(null, path)},})})],controllers: [UploadController]
})export class UploadModule {}upload.controller.ts
import { Controller,Post, UseInterceptors, UploadedFile } from '@nestjs/common';
import {FileInterceptor} from '@nestjs/platform-express'@Controller('upload')
export class UploadController {@Post('file')@UseInterceptors(FileInterceptor('file'))uploadFile(@UploadedFile() file) {return file.destination + file.filename}
}