NestJS学习笔记-01-第一个Nest应用诞生记 🚀

大家好,我是汪小成。

你是否曾深陷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 目录下的几个关键文件:

  1. main.ts : 应用的入口点

    typescript 复制代码
    import { 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 监听。

  2. app.module.ts : 根模块

    typescript 复制代码
    import { 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,这个模块管理着 AppControllerAppService

  3. app.controller.ts : 控制器

    typescript 复制代码
    import { 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 自动帮我们完成了。

  4. app.service.ts : 服务 (Provider)

    typescript 复制代码
    import { 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

相关推荐
转转技术团队42 分钟前
加Log就卡?不加Log就瞎?”——这个插件治好了我的精神
java·后端
谦行1 小时前
前端视角 Java Web 入门手册 5.5:真实世界 Web 开发——控制反转与 @Autowired
java·后端
uhakadotcom1 小时前
PyTorch 2.0:最全入门指南,轻松理解新特性和实用案例
后端·面试·github
bnnnnnnnn1 小时前
前端实现多服务器文件 自动同步宝塔定时任务 + 同步工具 + 企业微信告警(实战详解)
前端·javascript·后端
DataFunTalk1 小时前
乐信集团副总经理周道钰亲述 :乐信“黎曼”异动归因系统的演进之路
前端·后端·算法
DataFunTalk1 小时前
开源一个MCP+数据库新玩法,网友直呼Text 2 SQL“有救了!”
前端·后端·算法
idMiFeng2 小时前
通过GO后端项目实践理解DDD架构
后端
LemonDu2 小时前
Cursor入门教程-JetBrains过度向
人工智能·后端
LTPP2 小时前
掌握Rust Web开发的未来:Hyperlane框架全方位教程 🎓🔧
前端·后端·github
LemonDus2 小时前
Cursor入门教程-JetBrains过度向
后端·工具·技术知识