html模板网站模板下载,网站建设万禾,网站开发有什么软件有哪些,wordpress 文章 路径文章目录1、安装创建项目脚手架运行应用程序快速生成 CRUD 模块2、核心文件简要概述3、控制器4、模块5、中间件6、守卫#xff08;Guard#xff09;—— 鉴权 / 权限7、拦截器#xff08;Interceptor#xff09;—— 响应包装 / 日志 / 缓存8、最简使用示例NestJS 基于 Exp…文章目录1、安装创建项目脚手架运行应用程序快速生成 CRUD 模块2、核心文件简要概述3、控制器4、模块5、中间件6、守卫Guard—— 鉴权 / 权限7、拦截器Interceptor—— 响应包装 / 日志 / 缓存8、最简使用示例NestJS 基于 Express、socket.io 封装的 nodejs 后端开发框架1、安装Node.js版本 ≥20推荐使用最新 LTS 版本包管理器npmNode.js 自带、yarn 或 pnpm创建项目脚手架npmi -g nestjs/cli nest new project-name运行应用程序npmrun start:dev快速生成CRUD模块nest g resource user生成一个基础的 CRUD 功能nest g moname# 生成 modulenest g coname# 生成 controllernest g sname# 生成 servicenest g guname# 生成 guardnest g piname# 生成 pipenest build# 生产编译nest start:prod# 生产运行2、核心文件简要概述文件描述app.controller.ts一个具有单个路由的基本控制器。app.controller.spec.ts控制器的单元测试。app.module.ts应用程序的根模块。app.service.ts一个具有单个方法的基本服务。main.ts应用程序的入口文件它使用核心函数NestFactory来创建 Nest 应用程序实例。3、控制器路由Controller()将指定一个可选的路径前缀这样我们就不需要为文件中的每个路由重复该路径部分。路由参数Get(:id)当需要接收动态数据作为请求的一部分时可以在路由路径中添加路由参数标记来捕获 URL 中的动态值。Param()用于修饰方法参数使得路由参数可以在方法内部通过该装饰参数的属性进行访问。路由通配符Get(abcd/*)路由路径abcd/*将匹配abcd/、abcd/123、abcd/abc等路径。在基于字符串的路径中连字符-和点号.会按字面意义解析。请求对象Req()需要访问客户端的请求详细信息时可以通过在处理程序签名中使用Req()装饰器来指示 Nest 注入请求对象。资源Get()、Post()、Put()、Delete()、Patch()、Options()以及Head()。此外All()可定义处理所有这些方法的端点。状态码HttpCode(...)响应的默认状态码通常为200但 POST 请求除外其默认状态码为201响应头Header(Cache-Control, no-store)重定向Redirect()接收两个可选参数url和statusCode。若省略statusCode其默认值为302Found。4、模块Module()装饰器采用单个对象其属性描述模块providers将由 Nest 注入器实例化并且至少可以在该模块中共享的提供程序controllers此模块中定义的必须实例化的控制器集imports导出此模块所需的提供程序的导入模块列表exports这个模块提供的 providers 的子集应该在导入这个模块的其他模块中可用。你可以使用提供器本身或仅使用其令牌provide 值每个模块自动成为共享模块。一旦创建它就可以被任何模块重复使用。假设我们想在多个其他模块之间共享CatsService的实例。为此我们首先需要通过将该提供者添加到模块的exports数组来导出CatsService如下所示import{Module}fromnestjs/common;import{CatsController}from./cats.controller;import{CatsService}from./cats.service;Module({controllers:[CatsController],providers:[CatsService],exports:[CatsService]})exportclassCatsModule{}5、中间件本质在请求到达控制器之前对req/res进行拦截、加工、终止或放行。接口必须实现NestMiddleware的use(req, res, next)方法。注册位置只能在模块类的configure(consumer: MiddlewareConsumer)方法里绑定可精细控制路由与HTTP 方法。示例import{Module,NestModule,RequestMethod,MiddlewareConsumer}fromnestjs/common;import{LoggerMiddleware}from./common/middleware/logger.middleware;import{CatsModule}from./cats/cats.module;Module({imports:[CatsModule],})exportclassAppModuleimplementsNestModule{configure(consumer:MiddlewareConsumer){consumer.apply(LoggerMiddleware).forRoutes({path:cats,method:RequestMethod.GET});}}警告使用express适配器时NestJS 应用默认会注册body-parser包中的json和urlencoded中间件。这意味着如果你想通过MiddlewareConsumer自定义该中间件就需要在使用NestFactory.create()创建应用时将bodyParser标志设为false来禁用全局中间件。6、守卫Guard—— 鉴权 / 权限必须实现CanActivate接口。示例简易 JWT 守卫伪代码Injectable()exportclassJwtAuthGuardimplementsCanActivate{canActivate(context:ExecutionContext):boolean{constrequestcontext.switchToHttp().getRequest();returnrequest.headers.authorizationBearer valid-token;}}使用方法/UseGuards(JwtAuthGuard)全局app.useGlobalGuards(new JwtAuthGuard())7、拦截器Interceptor—— 响应包装 / 日志 / 缓存实现NestInterceptor接口。示例统一包装响应格式Injectable()exportclassTransformInterceptorTimplementsNestInterceptorT,{data:T}{intercept(context:ExecutionContext,next:CallHandler){returnnext.handle().pipe(map(data({data})));}}全局注册app.useGlobalInterceptors(newTransformInterceptor())此后所有正常响应都会变成{data:...原始内容}8、最简使用示例1. 生成 cats 模块nest g resource cats# 交互选择 REST 不生成 CRUD → 回车即可目录结构自动生成src └── cats ├── cats.controller.ts ├── cats.module.ts └── cats.service.ts2. 代码编写cats.service.tsimport{Injectable}fromnestjs/common;Injectable()exportclassCatsService{privatereadonlycats[tom,garfield,mimi];findAll():string[]{returnthis.cats;}}cats.controller.tsimport{Controller,Get}fromnestjs/common;import{CatsService}from./cats.service;Controller(cats)exportclassCatsController{constructor(privatereadonlycatsService:CatsService){}Get()findAll(){return{data:this.catsService.findAll()};}}浏览器 / Postman 访问http://localhost:3000/cats返回{data:[tom,garfield,mimi]}3. 单元测试cats.controller.spec.ts放在src/cats/下import{Test,TestingModule}fromnestjs/testing;import{CatsController}from./cats.controller;import{CatsService}from./cats.service;describe(CatsController,(){letcontroller:CatsController;letservice:CatsService;beforeEach(async(){constmodule:TestingModuleawaitTest.createTestingModule({controllers:[CatsController],providers:[CatsService],}).compile();controllermodule.getCatsController(CatsController);servicemodule.getCatsService(CatsService);});it(should return cat array,(){jest.spyOn(service,findAll).mockReturnValue([mock-cat]);expect(controller.findAll()).toEqual({data:[mock-cat]});});});跑测试npmtestcats.controller.spec.ts