使用 NestJS 构建高效且模块化的 Node.js 应用程序,从安装到第一个 API 端点:一步一步指南
一、安装 NestJS
要开始构建一个基于 NestJS 的应用,首先需要安装一系列依赖包。以下是必要的安装命令:
npm i --save @nestjs/core @nestjs/common rxjs reflect-metadata @nestjs/platform-express
npm install -g ts-node
| 包名 | 介绍 |
|---|---|
| @nestjs/core | NestJS 框架的核心模块,提供构建、启动和管理 NestJS 应用程序的基础设施。 |
| @nestjs/common | 包含构建 NestJS 应用的基础设施和常用装饰器、工具类、接口等,用于定义控制器、服务、中间件、守卫、拦截器、管道、异常过滤器等。 |
| rxjs | 用于构建异步和事件驱动程序的库,基于可观察序列的概念,提供强大的功能来处理异步数据流。 |
| reflect-metadata | 在 JavaScript 和 TypeScript 中实现元编程的库,通过提供元数据反射 API,允许在运行时检查和操作对象的元数据。 |
| @nestjs/platform-express | NestJS 的平台适配器,用于将 NestJS 应用与 Express.js 集成,提供 Express.js 的中间件、路由等功能,并享受 NestJS 的模块化、依赖注入等高级特性。 |
| ts-node | 使 Node.js 能直接运行 TypeScript 文件,无需额外编译步骤。 |
二、配置 TypeScript 编译选项
在项目的根目录下创建或更新 tsconfig.json 文件,以配置 TypeScript 编译选项:
{"compilerOptions": {"experimentalDecorators": true, // 启用装饰器特性"target": "ES2021", // 目标 JavaScript 版本"moduleResolution": "NodeNext", // 模块解析策略"module": "NodeNext" // 使用的模块系统}
}
三、创建应用程序入口文件 main.ts
在 src/ 目录下创建 main.ts 文件作为应用的入口点:
// 导入 NestFactory 模块,它用于创建 NestJS 应用程序的实例
import { NestFactory } from '@nestjs/core';
//导入跟模块
import { AppModule } from './app.module';// 创建一个异步函数,用于启动应用程序
async function bootstrap() {// 创建一个 NestJS 应用程序的实例const app = await NestFactory.create(AppModule);// 在底层使用 Express 框架// 启动应用程序,监听指定的端口await app.listen(3000);
}
bootstrap();
注释:此文件负责创建并启动 NestJS 应用实例。
四、定义应用模块 app.module.ts
接着,在 src/ 下创建 app.module.ts 来定义应用的主要模块:
import { AppController } from './app.controller';
import { Module } from '@nestjs/common';@Module({controllers: [AppController],
})
export class AppModule {}/*** @Moudle 是一个装饰器,用来定义模块,它接受一个对象作为参数,这个对象可以包含多个属性,这些属性定义了模块的配置信息。* 模块是组织代码的基本单元,它可以将相关的组件,(控制器、服务器、提供者)组合在一起,形成一个完整的系统。* Nest的模块系统是受Angular的模块系统启发而来的,它提供了一种灵活的方式来组织代码,使得代码更加模块化和可维护。*/
注释:模块是组织代码的基本单元,将相关组件组合在一起,构成可维护的应用结构。
五、构建控制器 app.controller.ts
最后,在 src/ 下创建 app.controller.ts 以实现 HTTP 请求处理器:
import { Controller, Get } from '@nestjs/common';@Controller('a') // 设置基础路径为 /a
export class AppController {@Get('b') // 结合基础路径,实际访问路径为 /a/bgetHello(): string {return 'Hello World!';}
}/*** @Controller 是一个装饰器,用于定义一个控制器类,该类将处理应用程序中的请求。* 控制器是处理传入 HTTP 请求的核心组件,每个控制器负责处理特定的请求路径和对应的 HTTP 方法。* 在控制器的内部会使用路由装饰器,如 @Get()、@Post()、@Put()、@Delete() 等,来定义具体的路由和对应的处理函数。* * @Get 是一个路由装饰器,用于将控制器的方法 getHello 映射到 HTTP GET 请求上。* 当用户访问 /a/b 路径时,将会调用 getHello 方法,并返回 'Hello World!' 字符串。* 通过 @Get 装饰器,可以指定该方法处理特定路径上的 GET 请求。*/
六、添加启动命令
为了让开发者能够方便地启动 NestJS 应用程序,可以在 package.json文件中的scripts 部分添加一个自定义脚本,用于简化启动过程。请将以下代码添加到 package.json 中:
"scripts": {"dev": "ts-node src/main.ts",// 其他脚本...
}
七、启动 NestJS 服务
现在你可以通过执行以下命令来启动你的 NestJS 应用程序:
npm run dev
注释:这将触发 package.json 中定义的 "dev" 脚本,进而启动应用程序。
7.1访问应用
一旦服务器成功启动,并且没有出现任何错误信息,你就可以在浏览器中访问应用程序了。根据你在控制器中设置的基础路径/a 和路由装饰器@Get('b'),你应该可以通过访问下面的 URL来测试你的第一个NestJS API 端点:
http://localhost:3000/a/b

注释:当你访问上述地址时,应该会看到返回的 'Hello World!' 字符串,这表示你的 NestJS 应用程序正在正确运行,并且可以处理 HTTP 请求。
八、提示
- 如果遇到端口占用问题,请检查是否有其他进程正在使用端口 3000,或者修改 main.ts 文件中的监听端口。
- 在开发环境中,考虑使用诸如 nodemon 或 concurrently 这样的工具来自动重启服务器,当源文件发生变化时,这能极大地提高开发效率。例如,可以安装 nodemon 并更新 package.json 的 dev 脚本如下:
"scripts": {"dev": "nodemon --exec ts-node src/main.ts"
}
注释:这样做之后,每次保存更改,NestJS 应用将会自动重启,从而即时反映代码的变化。
相关文章:
使用 NestJS 构建高效且模块化的 Node.js 应用程序,从安装到第一个 API 端点:一步一步指南
一、安装 NestJS 要开始构建一个基于 NestJS 的应用,首先需要安装一系列依赖包。以下是必要的安装命令: npm i --save nestjs/core nestjs/common rxjs reflect-metadata nestjs/platform-express npm install -g ts-node包名介绍nestjs/coreNestJS 框…...
2025年大模型技术发展趋势展望:高速旋转的飞轮
2025年大模型技术发展趋势展望 引言1. 多模态大模型(MMM):从单一模态到高级模态融合2. 轻量化大模型:从大参数模型到小参数模型3. 强推理大模型:从概率生成到逻辑推理4. 移动端/边缘端Agent:从云端到本地5.…...
java中类的加载过程及各个阶段与运行时数据区中堆和方法区存储内容
java中类的加载过程 Java 类的加载是 JVM 将 字节码文件(.class 文件)加载到内存并最终转化为运行时数据的过程。它分为以下 五个主要阶段:加载、验证、准备、解析、初始化,每个阶段都有对应的内存位置存储相关信息。以下是类加载…...
渗透测试--Web基础漏洞利用技巧
渗透测试--Web基础漏洞利用技巧 本文章写了Web基础漏洞中一些不那么常见的利用技巧,而不谈及漏洞的原理以及常见用法。 SQL 俺是SQLmap党,哈哈,所以这块就不多讲了。详情可见文章《渗透测试--SQLmap_渗透测试sqlmap-CSDN博客》 XXE XXE组成…...
SpringBoot下载文件的几种方式
小文件:直接将文件一次性读取到内存中,文件大可能会导致OOM GetMapping("/download1")public void download1(HttpServletResponse response) throws IOException {// 指定要下载的文件File file new File("C:\\Users\\syd\\Desktop\\do…...
教程:从pycharm基于anaconda构建机器学习环境并运行第一个 Python 文件
1. 安装 PyCharm 访问 PyCharm 官方网站:https://www.jetbrains.com/pycharm/。下载社区版(免费)或专业版(收费,提供更多功能)。按照操作系统的安装指导安装 PyCharm。安装后打开 PyCharm,并根…...
我用Ai学Android Jetpack Compose之Button
答案来自 通义千问,代码同样需要到Android Studio里实践,才能学会。完整工程代码见文末。 我要学Button,麻烦介绍一下 当然可以!Button 是 Jetpack Compose 中用于创建可点击按钮的 Composable 函数。它提供了丰富的配置选项来定…...
修改secure-file-priv参数-mysql5.7.26限制不允许导入或导出的解决方法
文章目录 前言secure_file_priv参数说明修改secure_file_priv参数的步骤 前言 本人是在sql注入的文件上传拿web shel 时所用到的写入文件权限遇到文件上传不成功的问题,记住修改后,重启mysql才生效,最后可以查看验证一下。 secure_file_priv…...
C# 设计模式(结构型模式):适配器模式
C# 设计模式(结构型模式):适配器模式 在软件开发中,我们经常会遇到需要将不同接口的组件结合在一起的情况。此时,适配器模式(Adapter Pattern)就派上了用场。它属于结构型设计模式,…...
Spring Cloud微服务多模块架构:父子工程搭建实践
一、前言 在现代微服务架构中,Spring Cloud 提供了一整套工具和技术栈来简化分布式系统的开发。为了更好地组织和管理复杂的微服务项目,使用 Maven 多模块(父子工程) 是一种高效的方法。 父子工程 是 Maven 中的一种项目结构…...
SkinnedMeshRenderer相关知识
SkinnedMeshRenderer和MeshRenderer unity中SkinnedMeshRenderer是CPU去更改顶点位置的。 而当使用MeshRenderer时,可以靠GPU来进行蒙皮(即更改顶点位置)。 SkinnedMeshRenderer是多线程处理的,在小程序游戏中,只支持…...
前端学习DAY30(水平)
子元素是在父元素的内容区中排列的,如果子元素的大小超过了父元素,则子元素会从 父元素中溢出,使用overflow属性设置父元素如何处理溢出的子元素 可选值:visible 默认值,子元素会从父元素中溢出,在父元素外…...
Spring boot 项目 Spring 注入 代理 并支持 代理对象使用 @Autowired 去调用其他服务
文章目录 类定义与依赖注入方法解析createCglibProxy注意事项setApplicationContext 方法createCglibProxy 方法 类定义与依赖注入 Service: 标识这是一个 Spring 管理的服务类。ApplicationContextAware: 实现该接口允许你在类中获取 ApplicationContext 对象,从而…...
Colyseus 与 HTTP API 的集成
Colyseus 与 HTTP API 的集成 在使用 Colyseus 开发实时多人应用时,通常需要与传统的 HTTP API 集成,例如用户身份验证、存储游戏数据、获取排行榜等。以下是 Colyseus 与 HTTP API 集成的详细介绍: 1. Colyseus 的基本架构 Colyseus 是一个…...
基于服务器部署的综合视频安防系统的智慧快消开源了。
智慧快消视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。国产化人工智能“…...
SpringBoot原理分析-1
SpringBoot原理分析 作为一个javaer,和boot打交道是很常见的吧。熟悉boot的人都会知道,启动一个springboot应用,就是用鼠标点一下启动main方法,然后等着就行了。我们来看看这个main里面。 SpringBootApplication public class E…...
HCIA-Access V2.5_7_5_XG(S)- GPON网络演进为XG(S)-PON网络
目前由于10 GPON ONU数量并没有得到大规模爆发,所以直接新建ODN网络成本相对较高,所以可以采用复用ODN的方案。 XG(S)-PON可以与GPON共享ODN 前面也介绍过GPON和10G GPON使用的波长,我们来回顾一下,在GPON网络中上行采用1310纳米波长,下行采用1490纳米的波长,而10G GPON…...
GPU算力平台的应用之任意门:任意穿搭匹配模型的应用教程
大家好,今天给大家介绍一下:GPU算力平台的应用之任意门:任意穿搭匹配模型的应用教程。 文章目录 一、GPU算力平台概述人工智能智能发展为什么需要GPU算力平台 二、注册与登录账号注册流程 三、平台的应用之Anydoor应用启动器选择Anydoor的应用场景Anydoo…...
如何利用人工智能算法优化知识分类和标签?
如何利用人工智能算法优化知识分类和标签? 聚类算法 原理与应用: 聚类算法是一种无监督学习算法,它可以根据数据的相似性将知识内容自动划分成不同的类别。例如,在文档知识库中,通过对文档内容的词向量表示应用 K -…...
Windows 11 系统中npm-cache优化
在 Windows 11 系统中,C:\Users\K\AppData\Local\npm-cache 文件夹是 npm(Node Package Manager) 用于缓存已下载的包的目录。缓存的存在可以加快包的安装速度,因为当再次安装相同的包时,npm 可以直接从缓存中获取&…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
