第一个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