掌握 NestJS 10.x:从零开始构建高效可扩展的服务器端应用详解

NestJS 是一个用于构建高效、可扩展的 Node.js 服务端应用的框架,基于 TypeScript 构建,并且受 Angular 的启发,提供了模块化、易测试、易维护的架构。NestJS 10.x 引入了一些新特性和改进,进一步提升了开发体验。本文将详细介绍如何使用 NestJS 10.x 构建一个基础应用,并涵盖常用功能和最佳实践。

在这里插入图片描述

1. 安装和初始化项目

安装 NestJS CLI

NestJS 提供了一个命令行工具(CLI),可以快速创建和管理项目。

npm install -g @nestjs/cli
创建新项目

使用 CLI 创建一个新的 NestJS 项目:

nest new project-name

根据提示选择包管理器(npm 或 yarn),CLI 会自动安装依赖并创建项目结构。

2. 项目结构

NestJS 项目具有模块化的结构,每个功能模块都包含控制器(Controllers)、提供者(Providers)和服务(Services)。

src/
├── app.controller.ts
├── app.controller.spec.ts
├── app.module.ts
├── app.service.ts
├── main.ts
  • app.controller.ts:定义应用的控制器。控制器处理传入的HTTP请求并返回HTTP响应。
  • app.service.ts:定义应用的服务。服务包含业务逻辑,并可以被控制器调用。
  • app.module.ts:定义应用的模块。模块用于组织和管理控制器、服务等组成部分。
  • main.ts:应用的入口文件。启动 NestJS 应用。

3. 创建模块、控制器和服务

创建模块

模块是组织代码的基本单元。使用 CLI 创建一个新模块:

nest generate module users
创建控制器

控制器负责处理传入的请求并返回响应。使用 CLI 创建一个新控制器:

nest generate controller users
创建服务

服务包含业务逻辑,通常通过依赖注入被控制器调用。使用 CLI 创建一个新服务:

nest generate service users

4. 控制器和服务的使用

定义控制器

控制器处理传入的请求并返回响应。

import { Controller, Get } from '@nestjs/common';
import { UsersService } from './users.service';@Controller('users')
export class UsersController {constructor(private readonly usersService: UsersService) {}@Get()findAll(): string {return this.usersService.findAll();}
}
定义服务

服务包含业务逻辑,通常通过依赖注入被控制器调用。

import { Injectable } from '@nestjs/common';@Injectable()
export class UsersService {findAll(): string {return 'This action returns all users';}
}

5. 使用中间件

中间件可以在请求处理管道中执行额外的操作,比如记录日志或验证请求。

import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';@Injectable()
export class LoggerMiddleware implements NestMiddleware {use(req: Request, res: Response, next: NextFunction) {console.log(`Request...`);next();}
}

在模块中应用中间件:

import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
import { LoggerMiddleware } from './logger.middleware';@Module({controllers: [UsersController],providers: [UsersService],
})
export class UsersModule implements NestModule {configure(consumer: MiddlewareConsumer) {consumer.apply(LoggerMiddleware).forRoutes('users');}
}

6. 使用管道(Pipes)

管道用于转换和验证请求数据。它们在请求到达控制器之前被调用。

import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException } from '@nestjs/common';@Injectable()
export class ValidationPipe implements PipeTransform {transform(value: any, metadata: ArgumentMetadata) {if (!value) {throw new BadRequestException('Validation failed');}return value;}
}

在控制器中使用管道:

import { Controller, Get, Query, UsePipes } from '@nestjs/common';
import { UsersService } from './users.service';
import { ValidationPipe } from './validation.pipe';@Controller('users')
export class UsersController {constructor(private readonly usersService: UsersService) {}@Get()@UsePipes(new ValidationPipe())findAll(@Query('name') name: string): string {return this.usersService.findAll();}
}

7. 使用拦截器(Interceptors)

拦截器用于拦截和处理控制器方法的调用,常用于日志记录、错误处理和响应映射。

import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';@Injectable()
export class LoggingInterceptor implements NestInterceptor {intercept(context: ExecutionContext, next: CallHandler): Observable<any> {console.log('Before...');const now = Date.now();return next.handle().pipe(tap(() => console.log(`After... ${Date.now() - now}ms`)),);}
}

在控制器中使用拦截器:

import { Controller, Get, UseInterceptors } from '@nestjs/common';
import { UsersService } from './users.service';
import { LoggingInterceptor } from './logging.interceptor';@Controller('users')
export class UsersController {constructor(private readonly usersService: UsersService) {}@Get()@UseInterceptors(LoggingInterceptor)findAll(): string {return this.usersService.findAll();}
}

结论

通过本教程,你可以快速上手 NestJS 10.x 并构建高效、可扩展的服务器端应用。NestJS 提供了丰富的功能和模块化架构,适合构建各种规模的应用。如果有任何问题或需要进一步的帮助,请在评论区留言或者联系我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/19615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

协方差和协方差矩阵是什么

协方差矩阵&#xff08;Covariance Matrix&#xff09;是一个矩阵&#xff0c;它包含多个随机变量之间的协方差。 协方差是衡量两个随机变量如何一起变化的度量。 协方差矩阵在多元统计分析和机器学习中非常重要&#xff0c;特别是在处理多元正态分布时。 详细解释 协方差&am…

生态融合促发展 YashanDB与丰图科技完成兼容性认证

近日&#xff0c;深圳计算科学研究院崖山数据库系统YashanDB V23与丰图科技智域城市数字孪生平台顺利完成兼容性互认证。经严格测试&#xff0c;双方产品完全兼容&#xff0c;稳定运行&#xff0c;充分满足企事业单位在高性能、高可用性、高稳定性及高可控性方面的核心需求&…

比较好的Python课程

最近在学习夜曲编程的Python进阶课程——办公效率化&#xff1b;夜曲编程之前有推出一款学习Python的入门课程&#xff0c;在手机端和电脑端都可以学习的&#xff0c;如果没有时间在手机端学习都很好的。每节课程学习下来&#xff0c;可以收集到Python入门的知识卡片&#xff0…

Ansys Mechanical|组装 External Mechanical Model

Assembling Finite Element Models 上文中介绍了如何导入外部模型并将其组合到单个模型中的示例。 如果要将外部模型与Workbench环境中已有的一个或多个模型组合在一起&#xff0c;该如何操作&#xff1f;本文将介绍这个工作流程。 Ansys Mechanical支持Mechanical Model和Ex…

FPGA新起点V1开发板(七-语法篇)——程序框架+高级语法(选择性做笔记)

文章目录 一、模块结构二、赋值三、条件语句 一、模块结构 默认是wire类型&#xff0c;assign是定义功能。 上面这两个always都是并行 例化 二、赋值 有两种赋值“”和“<” “”是阻塞赋值&#xff0c;也就是从上到下&#xff0c;依次完成 “”是非阻塞赋值&#xff0c;…

开展FMEA,这些准备工作你做足了吗?

在产品研发和制造过程中&#xff0c;失效模式与影响分析&#xff08;FMEA&#xff09;是一项至关重要的质量工具。它能够帮助团队提前识别和预防潜在的产品失效问题&#xff0c;从而提升产品的可靠性和质量。然而&#xff0c;要想充分发挥FMEA的效用&#xff0c;充分的准备工作…

【机器学习】Samba-CoE实现高效推理部署

Samba-CoE&#xff1a;突破AI内存墙&#xff0c;实现高效推理部署 一、引言二、Samba-CoE系统概述三、突破AI内存墙的关键技术流数据流三层内存系统 四、Samba-CoE的推理部署与优化动态模型切换资源优化分配性能加速 五、代码实例与实现细节六、结语 一、引言 随着人工智能技术…

Python爬虫实战(实战篇)—16获取【百度热搜】数据—写入Ecel(附完整代码)

文章目录 专栏导读背景结果预览1、爬取页面分析2、通过返回数据发现适合利用lxmlxpath3、继续分析【小说榜、电影榜、电视剧榜、汽车榜、游戏榜】4、完整代码总结 专栏导读 &#x1f525;&#x1f525;本文已收录于《Python基础篇爬虫》 &#x1f251;&#x1f251;本专栏专门…

AMD vs NVIDIA:2024年哪款显卡更适合你?

AMD与Nvidia之间的长期争论在显卡领域一直是一个热点话题&#xff0c;引发了游戏玩家和专业生产人士的热烈讨论。AMD和Nvidia都提供了种类丰富的 GPU&#xff0c;每款都有其优点和缺点。在本文中&#xff0c;我们将深入剖析选择AMD和Nvidia显卡时需要考虑的关键因素。 1.性能 …

【JavaEE】多线程(1)

&#x1f386;&#x1f386;&#x1f386;个人主页&#x1f386;&#x1f386;&#x1f386; &#x1f386;&#x1f386;&#x1f386;JavaEE专栏&#x1f386;&#x1f386;&#x1f386; &#x1f386;&#x1f386;&#x1f386;计算机是怎么工作的&#x1f386;&#x1f3…

neutron学习小结

概述 基于yoga版本学习neutron&#xff0c;通过源码、官方文档、部署环境进行学习 neutron-dhcp-agent neutron.agent.dhcp_agent.main 创建server&#xff0c;调oslo_service launch server&#xff0c;最后实际调了server的start方法 neutron.service.Service.start Serv…

蓝桥杯--杂题

1.贪心&#xff1a; 我们先枚举哪个国家赢了&#xff0c;然后再建一个数组排序即可。 下面是AC代码&#xff1a; #include<bits/stdc.h> using namespace std; #define int long long int n; int a[100010],b[100010],c[100010]; bool cmp(int a,int b) {return a>b…

服务器数据恢复—EqualLogic存储硬盘灯亮黄色的数据恢复案例

服务器数据恢复环境&#xff1a; 一台某品牌EqualLogic PS 6011型号存储&#xff0c;底层有一组由16块SAS硬盘组建的RAID5阵列&#xff0c;上层存储空间划分了4个卷&#xff0c;格式化为VMFS文件系统&#xff0c;存放虚拟机文件。 服务器故障&#xff1a; 存储设备上两块硬盘指…

微信小程序发送订阅消息

小程序后台。订阅消息里面&#xff0c;新建一个消息模板 小程序代码&#xff0c;登录后&#xff0c;弹出订阅信息 requestSubscribeMessage: function () {wx.requestSubscribeMessage({tmplIds: [-323232-32323], // 替换为你的模板IDsuccess(res) {// 用户订阅结果console.l…

第22讲:文件操作

文章目录 第22讲&#xff1a;文件操作1. 为什么使用文件2. 什么是文件2.1 程序文件2.2 数据文件2.3 文件名 3. 二进制文件和文本文件&#xff1f;4. 文件的打开和关闭4.1 流和标准流4.1.1 流4.1.2 标准流 4.2 文件指针4.3 文件的打开和关闭 5. 文件的顺序读写5.1 顺序读写函数介…

PyQt5开发笔记:1.环境搭建与界面美化

推荐视频教程&#xff1a; https://www.bilibili.com/video/BV1LT4y1e72X?p23&vd_source7ab611f3afb3d469faad93d3996f99ba 一、打开网址&#xff0c;点击下载 https://build-system.fman.io/qt-designer-download 下载后&#xff0c;点开exe 不推荐&#xff1a;http…

每周算法:次小生成树

题目链接 秘密的牛奶运输 题目描述 农夫约翰要把他的牛奶运输到各个销售点。 运输过程中&#xff0c;可以先把牛奶运输到一些销售点&#xff0c;再由这些销售点分别运输到其他销售点。 运输的总距离越小&#xff0c;运输的成本也就越低。 低成本的运输是农夫约翰所希望的…

react 动态form表单

需求在日常开发中反复写form 是一种低效的开发效率&#xff0c;布局而且还不同这就需要我们对其封装 为了简单明了看懂代码&#xff0c;我这里没有组件&#xff0c;都放在一起&#xff0c;简单抽离相信作为大佬的你&#xff0c;可以自己完成&#xff0c; 首先我们做动态form …

Gartner发布电信运营商应对持续变化的网络安全环境指南:现代云安全与网络安全的五大核心挑战

所有组织的云和网络都面临着高级威胁。作为网络安全的关键参与者&#xff0c;电信运营商的 CIO 需要了解行业面临的挑战&#xff0c;并了解应采用哪些解决方案来实现方法的现代化。 主要发现 电信运营商 (CSP) CIO 如果不能调整其安全策略来保护其环境&#xff0c;那么他们将会…

IDEA 中导入脚手架后该如何处理?

MySQL数据库创建啥的&#xff0c;没啥要说的&#xff01;自行配置即可&#xff01; 1.pom.xml文件&#xff0c;右键&#xff0c;add Maven Project …………&#xff08;将其添加为Maven&#xff09;【下述截图没有add Maven Project 是因为目前已经是Maven了&#xff01;&…