使用 NestJS 构建高效且模块化的 Node.js 应用程序,从安装到第一个 API 端点:一步一步指南

news2025/1/7 16:05:18

一、安装 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/b
  getHello(): 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 应用将会自动重启,从而即时反映代码的变化。

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

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

相关文章

第07章 存储管理(一)

一、磁盘简介 1.1 名称称呼 磁盘/硬盘/disk是同一个东西,不同于内存的是容量比较大。 1.2 类型 机械:机械硬盘即是传统普通硬盘,主要由:盘片,磁头,盘片转轴及控制电机,磁头控制器&#xff0…

Appium(一)--- 环境搭建

一、Android自动化环境搭建 1、JDK 必须1.8及以上(1) 安装:默认安装(2) 环境变量配置新建JAVA_HOME:安装路径新建CLASSPath%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar在path中增加:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;(3) 验证…

Framebuffer 驱动

实验环境: 正点原子alpha 开发板 调试自己编写的framebuffer 驱动,加载到内核之后,显示出小企鹅 1. Framebufer 总体框架 fbmem.c 作为Framebuffer的核心层,向上提供app使用的接口,向下屏蔽了底层各种硬件的差异; 准确来说fbmem.c 就是一个字符设备驱动框架的程序,对…

复变函数复习

复数 复数的方根计算 例题: 复变函数 导数 解析函数 调和函数 例题: V是U的共轭调和函数 但U不是V的共轭调和函数 其中U和V满足柯西黎曼方程 经典例题 求解析函数例题: 初等函数 指数函数 对数函数 幂函数 三角函数 级数 极限 收敛半…

在DJI无人机上运行VINS-FUISON(PSDK 转 ROS)

安装ceres出现以下报错,将2版本的ceres换成1版本的ceres CMake did not find one.Could not find a package configuration file provided by "absl" with any ofthe following names:abslConfig.cmakeabsl-config.cmakeAdd the installation prefix of …

HTML5实现好看的博客网站、通用大作业网页模板源码

HTML5实现好看的博客网站、通用大作业网页模板源码 前言一、设计来源1.1 主界面1.2 列表界面1.3 文章界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看的博客网站、通用大作业网页模板源码,博客网站源码,HTML模板源码&#xff0…

线性回归从0到1实践

导入需要的包 from idlelib.configdialog import tracers %matplotlib inline import random import torch from d2l import torch as d2l根据有噪声的线性模型构造一个人造数据集。我们使用线性模型参数 w [ 2 , − 3 , 4 ] T w [2,-3,4]^T w[2,−3,4]T、b4.2 和噪声 ϵ \…

从摩托罗拉手机打印短信的简单方法

昨天我试图从摩托罗拉智能手机上打印短信,但当我通过USB将手机连接到电脑时,我在电脑上找不到它们。由于我的手机内存已达到限制,并且我想保留短信的纸质版本,您能帮我将短信从摩托罗拉手机导出到计算机吗? 如您所知&…

elementui table 表格 分页多选,保持选中状态

elementui多选时分页,解决选中状态无法保留选中项问题: 在el-table标签中加入row-key,row-key的值取当前数据里的唯一key在el-table-column selection 项中加入以下:reserve-selection“true” 完成后,将需要清空的地方 ( 如返回…

《掌握 C/C++ 动态内存管理,让编程更高效灵活》

这里写目录标题 一、回顾C/C内存分布1. 三道基础的练习题2. 内存区域划分图 二、C 语言中动态内存的管理方式(malloc/calloc/realloc/free)1. malloc() 和 calloc() 的区别和注意事项2. realloc() 的用法和注意事项 三、C 中的动态内存管理方式&#xff…

网络安全抓包

#知识点: 1、抓包技术应用意义 //有些应用或者目标是看不到的,这时候就要进行抓包 2、抓包技术应用对象 //app,小程序 3、抓包技术应用协议 //http,socket 4、抓包技术应用支持 5、封包技术应用意义 总结点:学会不同对象采用…

今日头条ip属地根据什么显示?不准确怎么办

在今日头条这样的社交媒体平台上,用户的IP属地信息对于维护网络环境的健康与秩序至关重要。然而,不少用户发现自己的IP属地显示与实际位置不符,这引发了广泛的关注和讨论。本文将深入探讨今日头条IP属地的显示依据,并提供解决IP属…

CSS3——3. 书写格式二

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><body><!--css书写&#xff1a;--><!--1. 属性名:属性值--><!--2.属性值是对属性的相关描述--><!--3.属性名必须是…

C# OpenCV机器视觉:双目视觉-深度估计

在一个阳光欢快得仿佛要蹦迪的日子里&#xff0c;阿强像个即将踏上神秘星际旅行的宇航员&#xff0c;雄赳赳气昂昂地坐在实验室那张堆满奇奇怪怪小玩意儿的桌子前。桌上&#xff0c;两台摄像头宛如两个严阵以待的机甲战士&#xff0c;镜头闪烁着冷峻的光&#xff0c;仿佛在向阿…

网络IP协议

IP&#xff08;Internet Protocol&#xff0c;网际协议&#xff09;是TCP/IP协议族中重要的协议&#xff0c;主要负责将数据包发送给目标主机。IP相当于OSI&#xff08;图1&#xff09;的第三层网络层。网络层的主要作用是失陷终端节点之间的通信。这种终端节点之间的通信也叫点…

springboot566健美操评分系统(论文+源码)_kaic

摘 要 健美操评分系统采用B/S架构&#xff0c;数据库是MySQL。系统的搭建与开发采用了先进的JAVA进行编写&#xff0c;使用了springboot框架。该系统从三个对象&#xff1a;由管理员、裁判员和用户来对系统进行设计构建。主要功能包括首页&#xff0c;个人中心&#xff0c;裁…

【深度学习之空洞卷积】空洞卷积和普通卷积的比较包括哪些优势?从感受野、计算复杂度方面分析。

【深度学习之空洞卷积】空洞卷积和普通卷积的比较包括哪些优势&#xff1f;从感受野、计算复杂度方面分析。 【深度学习之空洞卷积】空洞卷积和普通卷积的比较包括哪些优势&#xff1f;从感受野、计算复杂度方面分析。 文章目录 【深度学习之空洞卷积】空洞卷积和普通卷积的比…

【机器遗忘之UNSIR算法】2023年IEEE Trans期刊论文:Fast yet effective machine unlearning

1 介绍 年份&#xff1a;2023 期刊&#xff1a;IEEE Transactions on Neural Networks and Learning Systems 引用量&#xff1a;170 Tarun A K, Chundawat V S, Mandal M, et al. Fast yet effective machine unlearning[J]. IEEE Transactions on Neural Networks and Le…

VSCode 在Windows下开发时使用Cmake Tools时输出Log乱码以及CPP文件乱码的终极解决方案

在Windows11上使用VSCode开发C程序的时候&#xff0c;由于使用到了Cmake Tools插件&#xff0c;在编译运行的时候&#xff0c;会出现输出日志乱码的情况&#xff0c;那么如何解决呢&#xff1f; 这里提供了解决方案&#xff1a; 当Settings里的Cmake: Output Log Encoding里设…

程序的环境(预处理详解)

一.程序的翻译环境和执行环境 在ANSI C&#xff08;标准c&#xff09;的任何一种实现中&#xff0c;存在两个不同的环境。 计算机是能够执行二进制指令的&#xff0c;但是我们写出的c语言代码是文本信息&#xff0c;计算机不能直接理解 第1种是翻译环境&#xff0c;在这个环境…