大家好,我是汪小成。
你是否曾深陷Node.js后端开发的"泥潭"?
- 项目一大,代码结构就杂乱无章,像一碗意大利面,难以维护?🍝
- 团队成员风格迥异,代码规范全靠自觉,合并代码心惊胆战?🤯
- 每次新项目都要重复搭建MVC结构、配置路由、思考分层,累觉不爱?😩
- 面对TypeScript的浪潮,想拥抱类型安全,却又觉得在Express/Koa上集成有点"别扭"?🤔
如果你对以上任何一点感同身受,那么恭喜你,今天这篇文章可能就是你一直在寻找的**"解药"**!
我们将一起踏上NestJS 的学习之旅。它是一个用于构建高效、可扩展的服务器端应用程序的渐进式Node.js框架。
今天,作为我们《NestJS学习笔记》系列文章的第一篇,我们将完成**最激动人心的一步:从零开始,创建并运行你的第一个NestJS应用!**✨
别担心,这绝不是枯燥的 "Hello World",你将从中窥见NestJS的优雅设计 和强大潜力。准备好了吗?Let's Go!
❓ NestJS 是什么?为什么是它?
A progressive Node.js framework for building efficient, reliable and scalable server-side applications.
**译:**一个渐进式的Node.js框架,用于构建高效、可靠且可扩展的服务器端应用程序。
简单来说,NestJS就是:
- 基于TypeScript构建: 享受静态类型检查带来的代码健壮性和开发效率提升。
- 拥抱后端架构最佳实践: 大量借鉴了Angular的思想,提供了清晰的模块化(Modules)、控制器(Controllers)、服务(Providers/Services) 结构。
- 底层基于Express(默认)或Fastify: 站在巨人肩膀上,性能有保障,生态也能复用。
- 内置依赖注入(DI)系统: 让你的代码轻松实现解耦和可测试性。
- 提供强大的CLI工具: 一键生成项目、模块、控制器等,告别重复劳动。
一句话总结:NestJS给Node.js后端开发带来了一套经过验证的、高效的、令人愉悦的架构规范。
它不是要取代Express/Koa,而是提供了一个更高级别的抽象和开发范式。
🛠️ 环境准备与第一个脚印
工欲善其事,必先利其器。确保电脑上安装了Node.js (推荐v20或更高版本)。
然后,打开终端工具iterm2,全局安装NestJS的灵魂------Nest CLI:
bash
npm i -g @nestjs/cli
这个CLI工具简直是效率神器,非常有用,后面我们会频繁用到它。
安装完成后,让我们创建第一个项目!找一个喜欢的目录,运行:
bash
# '01.hello-world' 是我们的项目名,你可以换成你喜欢的
nest new 01.hello-world
CLI会询问我们想使用哪个包管理器 (npm, yarn, pnpm),选择常用的即可。稍等片刻,CLI会自动帮我们创建好项目骨架并安装依赖。
完成后,进入项目目录:
bash
cd 01.hello-world
用VSCode打开这个项目,会看到一个清晰的目录结构:
bash
├── src/ # 核心代码目录
│ ├── app.controller.spec.ts # 控制器的单元测试
│ ├── app.controller.ts # 默认控制器
│ ├── app.module.ts # 根模块
│ ├── app.service.ts # 默认服务
│ └── main.ts # 应用入口文件
├── test/ # E2E 测试目录
├── .eslintrc.js
├── .gitignore
├── .prettierrc
├── nest-cli.json
├── package.json
├── README.md
├── tsconfig.build.json
├── tsconfig.json
是不是感觉井井有条 ?这就是NestJS带来的第一个好处------规范!
🚀 运行!让世界看到 "Hello World!"
迫不及待想看看成果了?在终端里运行:
bash
npm run start:dev
这个命令会以开发模式 启动我们的NestJS应用。它不仅会运行程序,还会监听文件变化 ,代码修改后自动重新编译和重启服务,开发体验Very Good!
当我们在终端看到类似下面的输出时,就表示我们的第一个Nest应用已经成功运行在3000
端口了!

现在,打开浏览器,访问http://localhost:3000
。
我们看到什么?熟悉的味道、熟悉的配方。
Hello World!
🎉 值得庆祝!我们的第一个NestJS应用成功运行了!🎉
🔬 庖丁解牛:剖析 "Hello World" 背后的秘密
这个"Hello World!"是如何产生的呢?让我们快速浏览一下 src
目录下的几个关键文件:
-
main.ts
: 应用的入口点。typescriptimport { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; async function bootstrap() { // 使用 NestFactory 创建 Nest 应用实例,AppModule 是根模块 const app = await NestFactory.create(AppModule); // 监听 3000 端口 await app.listen(process.env.PORT ?? 3000); } bootstrap();
它的职责是引导(bootstrap)我们的应用,指定根模块 (
AppModule
),并启动 HTTP 监听。 -
app.module.ts
: 根模块。typescriptimport { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; @Module({ // @Module 装饰器,标识这是一个模块类 imports: [], // 导入其他模块 controllers: [AppController], // 声明该模块负责实例化的控制器 providers: [AppService], // 声明该模块负责实例化的服务 (Provider) }) export class AppModule {}
模块是 NestJS 组织代码的基本单元。根模块
AppModule
告诉 Nest,这个模块管理着AppController
和AppService
。 -
app.controller.ts
: 控制器。typescriptimport { Controller, Get } from '@nestjs/common'; import { AppService } from './app.service'; @Controller() // @Controller 装饰器,定义了这个类是一个控制器,可以处理路由 export class AppController { // 依赖注入:Nest 会自动创建 AppService 实例并注入到这里 constructor(private readonly appService: AppService) {} @Get() // @Get 装饰器,将 HTTP GET / 请求映射到这个方法 getHello(): string { // 调用 Service 中的方法获取数据 return this.appService.getHello(); } }
控制器负责接收传入的请求 并返回响应 。
@Controller()
定义基础路由路径(这里为空,表示根路径/
),@Get()
定义了处理 GET 请求的方法。注意这里的constructor(private readonly appService: AppService)
,这是依赖注入 的体现!我们没有手动new AppService()
,NestJS 自动帮我们完成了。 -
app.service.ts
: 服务 (Provider)。typescriptimport { Injectable } from '@nestjs/common'; @Injectable() // @Injectable 装饰器,表示这个类可以被 Nest DI 系统管理 export class AppService { getHello(): string { // 具体的业务逻辑(这里很简单,就是返回一个字符串) return 'Hello World!'; } }
服务通常用来封装业务逻辑 。
@Injectable()
让这个类可以被注入到其他类(如 Controller)中。
看明白了吗? 请求流程大致是:

即使只是一个简单的 "Hello World",NestJS 也通过模块、控制器、服务 的明确分层,以及装饰器 的简洁语法,展现了其结构化 和声明式的编程风格。
🌟 总结与展望
今天,我们迈出了学习NestJS的第一步:
- 了解了NestJS为解决后端开发痛点而生。
- 使用Nest CLI快速创建了项目骨架。
- 成功运行了第一个"Hello World"应用。
- 初步剖析了NestJS的核心组件:模块、控制器、服务以及依赖注入。
是不是已经感受到了NestJS与众不同的优雅 和便捷?
📢 互动与支持
保持关注,不要走开!
如果你觉得这篇文章对你有帮助,请不吝:
- 点赞 👍
- 在看 👀
- 转发 ↗️
让更多朋友加入我们的NestJS探索之旅!
💬 欢迎在评论区留言分享你的想法或疑问,我们一起交流进步!
🔔 关注我的公众号「Java小成」 ,第一时间获取 《NestJS学习笔记》系列文章更新!
本文代码已同步至GitHub:
https://github.com/wanggch/learn-nestjs/tree/main/01.hello-world
。