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