第一个NestJS应用 #

创建项目 #

使用Nest CLI创建新项目:

bash
nest new hello-nest
cd hello-nest

项目入口文件 #

NestJS应用的入口文件是 src/main.ts

typescript
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

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

代码解析 #

代码 说明
NestFactory 创建Nest应用实例的工厂类
create(AppModule) 使用根模块创建应用
listen(3000) 在3000端口启动HTTP服务
bootstrap() 启动函数,包含应用初始化逻辑

根模块 #

src/app.module.ts 是应用的根模块:

typescript
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

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

@Module装饰器 #

@Module() 装饰器接收一个对象,包含以下属性:

属性 说明
imports 导入其他模块
controllers 注册控制器
providers 注册提供者(服务)
exports 导出提供者供其他模块使用

控制器 #

src/app.controller.ts 定义路由处理:

typescript
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();
  }
}

@Controller装饰器 #

@Controller() 装饰器定义控制器,可选参数指定路由前缀:

typescript
@Controller('users')  // 路由前缀 /users
export class UsersController {
  // ...
}

路由装饰器 #

装饰器 HTTP方法 说明
@Get() GET 获取资源
@Post() POST 创建资源
@Put() PUT 更新资源(完整)
@Patch() PATCH 更新资源(部分)
@Delete() DELETE 删除资源
@All() ALL 匹配所有方法

服务 #

src/app.service.ts 包含业务逻辑:

typescript
import { Injectable } from '@nestjs/common';

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

@Injectable装饰器 #

@Injectable() 装饰器将类标记为可注入的提供者,可以被注入到其他类中。

启动应用 #

bash
npm run start:dev

访问 http://localhost:3000,你将看到:

text
Hello World!

添加更多路由 #

让我们扩展控制器,添加更多路由:

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

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

  @Get('welcome')
  getWelcome(): string {
    return 'Welcome to NestJS!';
  }

  @Post('create')
  create(): string {
    return 'Resource created!';
  }
}

启动流程详解 #

NestJS应用的启动流程如下:

text
┌─────────────────────────────────────────────────────────────┐
│                      启动流程                                 │
├─────────────────────────────────────────────────────────────┤
│  1. bootstrap() 函数被调用                                   │
│     ↓                                                       │
│  2. NestFactory.create(AppModule)                           │
│     - 加载根模块                                             │
│     - 解析模块依赖                                           │
│     - 初始化依赖注入容器                                     │
│     - 实例化所有Provider                                     │
│     ↓                                                       │
│  3. app.listen(3000)                                        │
│     - 创建HTTP服务器                                         │
│     - 绑定端口                                               │
│     - 开始监听请求                                           │
│     ↓                                                       │
│  4. 应用就绪,等待请求                                       │
└─────────────────────────────────────────────────────────────┘

配置应用 #

修改端口 #

typescript
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3001);  // 修改为3001端口
}

使用环境变量 #

typescript
import { ConfigService } from '@nestjs/config';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  const configService = app.get(ConfigService);
  const port = configService.get('PORT') || 3000;
  await app.listen(port);
}

启用CORS #

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

设置全局前缀 #

typescript
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.setGlobalPrefix('api');  // 所有路由添加/api前缀
  await app.listen(3000);
}

创建用户模块 #

使用CLI创建用户模块:

bash
# 创建模块
nest g module users

# 创建控制器
nest g controller users

# 创建服务
nest g service users

生成的文件结构:

text
src/
├── users/
│   ├── users.module.ts
│   ├── users.controller.ts
│   └── users.service.ts
├── app.module.ts
└── main.ts

用户控制器 #

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

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

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

  @Get(':id')
  findOne(@Param('id') id: string) {
    return this.usersService.findOne(+id);
  }

  @Post()
  create(@Body() createUserDto: any) {
    return this.usersService.create(createUserDto);
  }
}

用户服务 #

typescript
import { Injectable } from '@nestjs/common';

@Injectable()
export class UsersService {
  private users = [
    { id: 1, name: 'John', email: 'john@example.com' },
    { id: 2, name: 'Jane', email: 'jane@example.com' },
  ];

  findAll() {
    return this.users;
  }

  findOne(id: number) {
    return this.users.find(user => user.id === id);
  }

  create(createUserDto: any) {
    const newUser = {
      id: this.users.length + 1,
      ...createUserDto,
    };
    this.users.push(newUser);
    return newUser;
  }
}

用户模块 #

typescript
import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';

@Module({
  controllers: [UsersController],
  providers: [UsersService],
})
export class UsersModule {}

注册到根模块 #

typescript
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UsersModule } from './users/users.module';

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

测试API #

使用curl或Postman测试:

bash
# 获取所有用户
curl http://localhost:3000/users

# 获取单个用户
curl http://localhost:3000/users/1

# 创建用户
curl -X POST http://localhost:3000/users \
  -H "Content-Type: application/json" \
  -d '{"name":"Tom","email":"tom@example.com"}'

总结 #

本章我们创建了第一个NestJS应用,学习了:

  • 应用的入口文件和启动流程
  • 模块、控制器、服务的基本概念
  • 路由的定义和使用
  • 使用CLI生成代码

接下来,让我们深入了解 项目结构解析

最后更新:2026-03-28