为什么选择 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 的优势
- 架构清晰:采用模块化设计,代码组织更加清晰
- TypeScript 支持:默认使用 TypeScript,提供更好的类型安全
- 依赖注入:内置依赖注入容器,更好的解耦和测试
- 开箱即用:内置了很多功能,如验证、日志、缓存等
- 企业级框架:适合构建大型应用
环境准备
在开始之前,确保你的电脑已经安装了:
- Node.js (推荐 v14 或更高版本)
- npm 或 yarn 包管理器
- TypeScript 的基础知识
创建第一个 NestJS 项目
1. 安装 NestJS CLI
bash
npm i -g @nestjs/cli2. 创建新项目
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.json3. 项目结构解释
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 测试工具来测试你的接口。
最佳实践
- 使用 DTO (Data Transfer Objects):
typescript
// src/users/dto/create-user.dto.ts
export class CreateUserDto {
readonly name: string;
readonly email: string;
}- 使用服务层处理业务逻辑:
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;
}
}- 模块化组织代码:
typescript
// src/users/users.module.ts
@Module({
controllers: [UsersController],
providers: [UsersService],
})
export class UsersModule {}总结
通过这篇文章,我们:
- 了解了为什么选择 NestJS
- 学会了如何创建和运行 NestJS 项目
- 创建了第一个 API
- 了解了基本的项目结构和开发流程
下一篇文章,我们将深入探讨 NestJS 的控制器(Controller)。