Skip to content

为什么选择 NestJS? ​

在开始之前,我们先来理解为什么要选择 NestJS。作为一个 Node.js 开发者,你可能已经很熟悉 Express 或 Koa 这样的框架。那么为什么还需要 NestJS 呢?

Express vs NestJS ​

让我们通过一个简单的例子来对比:

Express 写法:

javascript
const express = require('express');
const app = express();

// 手动组织路由和中间件
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

// 手动处理错误
app.use((err, req, res, next) => {
  res.status(500).json({ error: err.message });
});

// 路由定义分散,需要手动管理
app.get('/users', (req, res) => {
  // 处理逻辑
});

app.post('/users', (req, res) => {
  // 处理逻辑
});

module.exports = app;

NestJS 写法:

typescript
import { Controller, Get, Post, Body } from '@nestjs/common';

@Controller('users')
export class UsersController {
  @Get()
  findAll() {
    // 处理逻辑
  }

  @Post()
  create(@Body() createUserDto: CreateUserDto) {
    // 处理逻辑
  }
}

NestJS 的优势 ​

  1. 架构清晰:采用模块化设计,代码组织更加清晰
  2. TypeScript 支持:默认使用 TypeScript,提供更好的类型安全
  3. 依赖注入:内置依赖注入容器,更好的解耦和测试
  4. 开箱即用:内置了很多功能,如验证、日志、缓存等
  5. 企业级框架:适合构建大型应用

环境准备 ​

在开始之前,确保你的电脑已经安装了:

  1. Node.js (推荐 v14 或更高版本)
  2. npm 或 yarn 包管理器
  3. TypeScript 的基础知识

创建第一个 NestJS 项目 ​

1. 安装 NestJS CLI ​

bash
npm i -g @nestjs/cli

2. 创建新项目 ​

bash
nest new my-nest-project

这个命令会创建一个基础的项目结构:

my-nest-project/
├── src/
│   ├── app.controller.ts
│   ├── app.service.ts
│   ├── app.module.ts
│   └── main.ts
├── test/
├── package.json
└── tsconfig.json

3. 项目结构解释 ​

typescript
// main.ts - 应用程序的入口文件
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
}
bootstrap();

// app.module.ts - 根模块
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  imports: [],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

// app.controller.ts - 控制器
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
}

// app.service.ts - 服务
import { Injectable } from '@nestjs/common';

@Injectable()
export class AppService {
  getHello(): string {
    return 'Hello World!';
  }
}

运行项目 ​

bash
# 开发模式
npm run start:dev

# 生产模式
npm run start:prod

访问 http://localhost:3000 就能看到 "Hello World!" 了。

创建第一个 API ​

让我们创建一个简单的用户 API:

typescript
// src/users/users.controller.ts
import { Controller, Get, Post, Body } from '@nestjs/common';

@Controller('users')
export class UsersController {
  private users = [];

  @Get()
  findAll() {
    return this.users;
  }

  @Post()
  create(@Body() user: any) {
    this.users.push(user);
    return user;
  }
}

将控制器添加到模块中:

typescript
// src/app.module.ts
import { Module } from '@nestjs/common';
import { UsersController } from './users/users.controller';

@Module({
  controllers: [UsersController],
})
export class AppModule {}

现在你可以:

  • GET /users 获取用户列表
  • POST /users 创建新用户

调试与开发 ​

1. 使用 VS Code 调试 ​

创建 .vscode/launch.json:

json
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Debug Nest Framework",
      "args": ["${workspaceFolder}/src/main.ts"],
      "runtimeArgs": ["--nolazy", "-r", "ts-node/register"],
      "sourceMaps": true,
      "cwd": "${workspaceRoot}",
      "protocol": "inspector"
    }
  ]
}

2. 使用 Postman 测试 API ​

可以使用 Postman 或其他 API 测试工具来测试你的接口。

最佳实践 ​

  1. 使用 DTO (Data Transfer Objects):
typescript
// src/users/dto/create-user.dto.ts
export class CreateUserDto {
  readonly name: string;
  readonly email: string;
}
  1. 使用服务层处理业务逻辑:
typescript
// src/users/users.service.ts
@Injectable()
export class UsersService {
  private users = [];

  create(user: CreateUserDto) {
    this.users.push(user);
    return user;
  }

  findAll() {
    return this.users;
  }
}
  1. 模块化组织代码:
typescript
// src/users/users.module.ts
@Module({
  controllers: [UsersController],
  providers: [UsersService],
})
export class UsersModule {}

总结 ​

通过这篇文章,我们:

  1. 了解了为什么选择 NestJS
  2. 学会了如何创建和运行 NestJS 项目
  3. 创建了第一个 API
  4. 了解了基本的项目结构和开发流程

下一篇文章,我们将深入探讨 NestJS 的控制器(Controller)。

相关资源 ​