使用 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 编译选项:

json 复制代码
{
    "compilerOptions": {
        "experimentalDecorators": true, // 启用装饰器特性
        "target": "ES2021", // 目标 JavaScript 版本
        "moduleResolution": "NodeNext", // 模块解析策略
        "module": "NodeNext" // 使用的模块系统
    }
}

三、创建应用程序入口文件 main.ts

在 src/ 目录下创建 main.ts 文件作为应用的入口点:

js 复制代码
// 导入 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 来定义应用的主要模块:

js 复制代码
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 请求处理器:

js 复制代码
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 中:

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 脚本如下:
json 复制代码
"scripts": {
  "dev": "nodemon --exec ts-node src/main.ts"
}

注释:这样做之后,每次保存更改,NestJS 应用将会自动重启,从而即时反映代码的变化。

相关推荐
LLLuckyGirl~6 小时前
node.js版本管理之---npm 和 package.json
node.js
qq_458563816 小时前
npm发布自定义包
前端·npm·node.js
单线程bug6 小时前
npx和npm和pnpm的异同
前端·npm·node.js
itzixiao7 小时前
使用npm 插件[mmdc]将.mmd时序图转换为图片
前端·npm·node.js
m0_7482356110 小时前
搭建Node.js后端
arcgis·node.js
max50060013 小时前
不同操作系统下安装Node.js及配置环境的详细步骤
node.js
小远披荆斩棘13 小时前
Mac中配置Node.js前端vscode环境(第二期)
前端·macos·node.js
<e^πi+1=0>15 小时前
使用Node编写服务器接口
node.js
vvw&1 天前
在 Ubuntu 22.04 上部署 AppArmor 应用安全教程
linux·运维·服务器·nginx·安全·ubuntu·node.js
LLLuckyGirl~1 天前
node.js内置模块之---stream 模块
node.js