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

NestJS 是基于 Node.js 的渐进式后端框架,核心特点包括 **依赖注入、模块化架构、装饰器驱动、TypeScript 优先、与主流工具集成** 等

NestJS 是基于 Node.js 的渐进式后端框架,核心特点包括 依赖注入、模块化架构、装饰器驱动、TypeScript 优先、与主流工具集成 等。以下通过代码示例,直观展示其核心特点:

一、TypeScript 优先(强类型支持)

NestJS 原生支持 TypeScript,类型定义清晰,减少运行时错误:

// src/user/dto/create-user.dto.ts(数据传输对象,强类型校验)
import { IsString, IsEmail, MinLength } from 'class-validator';export class CreateUserDto {@IsString() // 校验字段类型为字符串name: string;@IsEmail() // 校验邮箱格式email: string;@MinLength(6) // 密码最小长度 6password: string;
}

二、模块化架构(Module)

Nest 用 Module 组织代码,实现功能解耦,每个模块包含控制器、服务等:

// src/user/user.module.ts
import { Module } from '@nestjs/common';
import { UserController } from './user.controller';
import { UserService } from './user.service';@Module({controllers: [UserController], // 注册控制器(处理请求)providers: [UserService],      // 注册服务(业务逻辑)exports: [UserService],        // 导出服务,供其他模块使用
})
export class UserModule {}// src/app.module.ts(根模块,入口)
import { Module } from '@nestjs/common';
import { UserModule } from './user/user.module';@Module({imports: [UserModule], // 导入子模块
})
export class AppModule {}

三、装饰器驱动(Controller + Route)

用装饰器快速定义路由、请求方法、参数绑定,语法简洁:

// src/user/user.controller.ts(控制器:处理 HTTP 请求)
import { Controller, Get, Post, Body, Param, Query } from '@nestjs/common';
import { UserService } from './user.service';
import { CreateUserDto } from './dto/create-user.dto';@Controller('users') // 基础路由:/users
export class UserController {constructor(private readonly userService: UserService) {}// POST /users (创建用户,自动校验 CreateUserDto)@Post()create(@Body() createUserDto: CreateUserDto) {return this.userService.create(createUserDto);}// GET /users (查询所有用户,支持分页参数)@Get()findAll(@Query('page') page = 1, @Query('limit') limit = 10) {return this.userService.findAll({ page, limit });}// GET /users/:id (查询单个用户,路径参数绑定)@Get(':id')findOne(@Param('id') id: string) {return this.userService.findOne(+id); // 转换为数字}
}

四、依赖注入(DI)

Nest 内置依赖注入容器,解耦组件依赖,便于测试和维护:

// src/user/user.service.ts(服务:封装业务逻辑)
import { Injectable } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';// @Injectable() 标记为可注入的服务,供控制器/其他服务依赖
@Injectable()
export class UserService {private users = []; // 模拟数据库create(createUserDto: CreateUserDto) {const user = { id: Date.now(), ...createUserDto };this.users.push(user);return user;}findAll({ page, limit }) {const start = (page - 1) * limit;return this.users.slice(start, start + limit);}findOne(id: number) {return this.users.find(user => user.id === id);}
}// 控制器中自动注入 UserService(无需手动实例化)
// constructor(private readonly userService: UserService) {}

五、中间件(Middleware)

拦截请求/响应,实现日志、认证等通用逻辑:

// src/logging.middleware.ts
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';@Injectable()
export class LoggingMiddleware implements NestMiddleware {use(req: Request, res: Response, next: NextFunction) {console.log(`[${new Date().toISOString()}] ${req.method} ${req.originalUrl}`);next(); // 继续执行后续逻辑}
}// 在模块中注册中间件
// src/app.module.ts
import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';@Module({ imports: [UserModule] })
export class AppModule implements NestModule {configure(consumer: MiddlewareConsumer) {consumer.apply(LoggingMiddleware) // 应用中间件.forRoutes('users'); // 对 /users 路由生效(可指定控制器/通配符)}
}

六、守卫(Guard)

权限控制,决定请求是否能进入控制器:

// src/auth.guard.ts(认证守卫)
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';@Injectable()
export class AuthGuard implements CanActivate {canActivate(context: ExecutionContext): boolean {const request = context.switchToHttp().getRequest();return !!request.headers.authorization; // 简单校验是否有 Authorization 头}
}// 在控制器/路由上使用
import { UseGuards } from '@nestjs/common';
import { AuthGuard } from '../auth.guard';@Controller('users')
@UseGuards(AuthGuard) // 整个控制器需要认证
export class UserController {// 或单独对某个路由生效@Get(':id')@UseGuards(AuthGuard)findOne(@Param('id') id: string) { ... }
}

七、拦截器(Interceptor)

处理请求/响应转换、异常捕获、超时控制等:

// src/transform.interceptor.ts(响应格式化)
import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';// 统一响应格式:{ data: ..., success: true }
export interface Response<T> {data: T;success: boolean;
}@Injectable()
export class TransformInterceptor<T> implements NestInterceptor<T, Response<T>> {intercept(context: ExecutionContext, next: CallHandler): Observable<Response<T>> {return next.handle().pipe(map(data => ({data,success: true,})),);}
}// 全局注册(所有响应生效)
// src/main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { TransformInterceptor } from './transform.interceptor';async function bootstrap() {const app = await NestFactory.create(AppModule);app.useGlobalInterceptors(new TransformInterceptor());await app.listen(3000);
}
bootstrap();

八、异常过滤器(Exception Filter)

统一异常处理,自定义错误响应格式:

// src/http-exception.filter.ts
import { ExceptionFilter, Catch, ArgumentsHost, HttpException } from '@nestjs/common';
import { Request, Response } from 'express';@Catch(HttpException) // 捕获 HttpException 及其子类
export class HttpExceptionFilter implements ExceptionFilter {catch(exception: HttpException, host: ArgumentsHost) {const ctx = host.switchToHttp();const response = ctx.getResponse<Response>();const request = ctx.getRequest<Request>();const status = exception.getStatus();response.status(status).json({statusCode: status,message: exception.getResponse(),path: request.url,timestamp: new Date().toISOString(),});}
}// 全局注册
// src/main.ts
import { HttpExceptionFilter } from './http-exception.filter';async function bootstrap() {const app = await NestFactory.create(AppModule);app.useGlobalFilters(new HttpExceptionFilter());await app.listen(3000);
}

核心特点总结

特点说明
TypeScript 优先强类型支持,提升代码可读性和可维护性
模块化架构按功能拆分模块,解耦清晰
依赖注入自动管理组件依赖,便于测试和扩展
装饰器驱动简化路由、中间件、守卫等配置
丰富的扩展点中间件、守卫、拦截器、过滤器等
生态集成无缝对接 Express/Fastify、TypeORM/Mongoose、JWT 等

以上代码覆盖了 NestJS 最核心的特性,可直接运行(需先初始化 Nest 项目:nest new nest-demo)。实际开发中,还可结合其 CLI 工具快速生成模块、控制器、服务,提升开发效率。

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

相关文章:

  • 学雷锋 做美德少年网站wordpress 内容页面
  • WordPress电影网站源码东坑仿做网站
  • Android深入探索Activity生命周期与启动模式
  • 阿里云做网站的深圳关键词推广优化
  • 太湖度假区建设局网站河南郑州做网站h汉狮
  • HTML5+CSS3+JS小实例:爆炸粒子魔法按钮
  • Go语言入门指南-从零开始的奇妙之旅
  • 电子商务网站推广案例电子商务基础网站建设与维护单项选择题
  • logo设计制作公司夫唯seo
  • LeetCode 155. 最小栈
  • 杭州企业网站建设方案大连零基础网站建设教学公司
  • 使用腾讯云函数和云存储开发android app更新功能开发遇到的坑和解决方案
  • 韶关市建设局网站梅州做网站
  • 服装网站建设的规划百度推广多少钱
  • 电机驱动的总结和实战
  • php儿童摄影网站源码浏览器推广哪个平台好
  • 做论坛网站怎么赚钱吗江苏省交通建设局网站首页
  • 虚拟地址空间:揭秘Linux内存
  • 嵌入式开发安装Samba服务实现方法
  • 网站开发人员要求备案个人可以做视频网站
  • 网站为契机建设校园数字化上海网站建设哪家技术好
  • 人工智能决策系统和传统决策模型相比有什么优势?
  • 简述dw网站建设步骤网站建设哪家便宜
  • 未来新科技:纳米酶——类酶纳米材料的突破性应用与前景
  • 数据结构(c++版):深入理解哈希计数器
  • 网站侧边栏代码网站设计制作哪种快
  • Flutter SlideTransition 实现平移动画
  • Android EDLA 认证提测前的基本开发和准备简要说明
  • 潍坊网站设计制作seo软件服务
  • 心连网网站wordpress4.9博客模板