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

使用 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 框架的核心模块,提供构建、启动和管理 NestJS 应用程序的基础设施。
@nestjs/common包含构建 NestJS 应用的基础设施和常用装饰器、工具类、接口等,用于定义控制器、服务、中间件、守卫、拦截器、管道、异常过滤器等。
rxjs用于构建异步和事件驱动程序的库,基于可观察序列的概念,提供强大的功能来处理异步数据流。
reflect-metadata在 JavaScript 和 TypeScript 中实现元编程的库,通过提供元数据反射 API,允许在运行时检查和操作对象的元数据。
@nestjs/platform-expressNestJS 的平台适配器,用于将 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 可以直接从缓存中获取&…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言:多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...