当前位置: 首页 > news >正文

使用nestjs/cli创建nest.js新项目

1.安装nest.js脚手架并新建项目

npm i -g nestjs/cli
nest new project-name

2.安装和配置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=4UZ7JD34HF983

5.安装配置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/multer

src下新建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}
}

http://www.dtcms.com/a/596376.html

相关文章:

  • 广州外贸网站建设公司平面设计主要做什么工资多少
  • 广东省建设工程交易中心网站网站关键词不稳定
  • 组建网站需多少钱微信网站模板
  • jfinal 支持mysql的json字段类型解决方案
  • Excel处理控件Aspose.Cells教程:如何使用C#在Excel中添加、编辑和更新切片器
  • Java 在 Excel 文件中添加或删除分节符
  • 电子电气架构 --- 车载OTA功能
  • Chrome HSTS(HTTP Strict Transport Security)
  • 【项目亮点】基于EasyExcel + 线程池解决POI文件导出时的内存溢出及超时问题
  • 【C++】链表算法习题
  • 搭建智能问答系统需要什么文档解析工具?
  • 【C++】(以及大多数编程语言)中常见的 六种基本位运算操作
  • (129页PPT)罗兰贝格银行风险预警管理体系规划(附下载方式)
  • 建设银行网站可以更改个人电话网址大全域名解析
  • 增删查改(其一) —— insert插入 与 select条件查询
  • JuiceSSH+cpolar解锁手机远程Linux新姿势,无需公网IP,固定地址稳定用
  • 传统生产制造企业手写单据数字化落地:旗讯 OCR 的技术实现与系统对接方案
  • 如何添加网站白名单广州建设网站的公司
  • nnUNet 训练与推理命令操作记录
  • 【C#】从一次异步锁逐渐展开浅谈服务器架构解决重复编码问题,我与AI的一次深度讨论得出的一些解决方案
  • PKHeX 宝可梦存档编辑工具 用户可自由修改宝可梦属性、技能、道具、图鉴完成度等信息
  • 深度解析:环形链表——手撕面试经典题
  • elasticsearch集群访问中的通信问题
  • 西安模板网站建设套餐佛山做网站费用
  • 什么是RKNN?
  • 《智元启示录》升级说明:从「AI 思考集」到「AI 决策内参」
  • Ansible 基础配置与负载均衡部署实践
  • 融合先验文本与解剖学知识的多模态回归网络用于舌鳞状细胞癌浸润深度的自动预测|文献速递-文献分享
  • 【负载均衡】LVS DR模式详解
  • 从零搭建 ASP.NET 单文件 Web 项目:一个能真用的 BookShop 管理页实战