0到1使用Nest框架搭建后端服务
1. Nest.js 介绍
Nest.js 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的框架。它使用渐进式 JavaScript,使用 TypeScript 构建,并结合了 OOP(面向对象编程)、FP(函数式编程)和 FRP(函数式响应编程)的元素。
在底层,Nest.js 默认使用 Express.js,但也可以配置为使用 Fastify,这使得它与广泛的其他库完全兼容。
2. 核心优势
2.1 TypeScript 支持
- 默认使用 TypeScript 开发,提供完整的类型系统
- 更好的代码提示和错误检查
- 面向对象编程的特性支持
2.2 模块化架构
- 采用模块化设计,便于代码组织和维护
- 每个功能模块都是独立的,可以方便地进行单元测试
- 支持依赖注入,使代码更加解耦
2.3 完整的生态系统
- 内置支持 WebSocket
- 支持 GraphQL
- 微服务支持
- CLI 工具支持
- 丰富的中间件
2.4 优秀的文档和社区支持
- 完善的官方文档
- 活跃的社区
- 大量的最佳实践和示例
3. 入门指南
3.1 环境准备
首先确保你的机器上已经安装了 Node.js(建议版本 >= 12.x)。然后全局安装 Nest CLI:
bash
npm i -g @nestjs/cli
3.2 创建新项目
使用 Nest CLI 创建新项目:
bash
nest new project-name
3.3 项目结构
一个基本的 Nest.js 项目结构如下:
src/
├── app.controller.ts
├── app.module.ts
├── app.service.ts
└── main.ts
main.ts
: 应用程序的入口文件app.module.ts
: 根模块文件app.controller.ts
: 基本控制器app.service.ts
: 基本服务
4. 实战案例:构建一个简单的用户管理 API
让我们创建一个简单的用户管理 API,包含基本的 CRUD 操作。
4.1 创建用户模块
typescript
// src/users/users.module.ts
import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
@Module({
controllers: [UsersController],
providers: [UsersService],
})
export class UsersModule {}
4.2 定义用户实体
typescript
// src/users/user.entity.ts
export class User {
id: number;
name: string;
email: string;
createdAt: Date;
}
4.3 创建用户服务
typescript
// src/users/users.service.ts
import { Injectable } from '@nestjs/common';
import { User } from './user.entity';
@Injectable()
export class UsersService {
private users: User[] = [];
create(user: Omit<User, 'id' | 'createdAt'>): User {
const newUser = {
id: Date.now(),
...user,
createdAt: new Date(),
};
this.users.push(newUser);
return newUser;
}
findAll(): User[] {
return this.users;
}
findOne(id: number): User {
return this.users.find(user => user.id === id);
}
update(id: number, updateUser: Partial<User>): User {
const user = this.findOne(id);
if (user) {
Object.assign(user, updateUser);
}
return user;
}
remove(id: number): boolean {
const index = this.users.findIndex(user => user.id === id);
if (index !== -1) {
this.users.splice(index, 1);
return true;
}
return false;
}
}
4.4 创建用户控制器
typescript
// src/users/users.controller.ts
import { Controller, Get, Post, Body, Param, Put, Delete } from '@nestjs/common';
import { UsersService } from './users.service';
import { User } from './user.entity';
@Controller('users')
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@Post()
create(@Body() createUser: Omit<User, 'id' | 'createdAt'>) {
return this.usersService.create(createUser);
}
@Get()
findAll() {
return this.usersService.findAll();
}
@Get(':id')
findOne(@Param('id') id: string) {
return this.usersService.findOne(+id);
}
@Put(':id')
update(@Param('id') id: string, @Body() updateUser: Partial<User>) {
return this.usersService.update(+id, updateUser);
}
@Delete(':id')
remove(@Param('id') id: string) {
return this.usersService.remove(+id);
}
}
4.5 在主模块中注册用户模块
typescript
// src/app.module.ts
import { Module } from '@nestjs/common';
import { UsersModule } from './users/users.module';
@Module({
imports: [UsersModule],
})
export class AppModule {}
4.6 测试 API
启动应用:
bash
npm run start:dev
现在你可以使用 Postman 或 curl 测试以下接口:
bash
- 创建用户:POST http://localhost:3000/users
- 获取所有用户:GET http://localhost:3000/users
- 获取单个用户:GET http://localhost:3000/users/:id
- 更新用户:PUT http://localhost:3000/users/:id
- 删除用户:DELETE http://localhost:3000/users/:id
5. 总结
通过这个简单的示例,我们了解了 Nest.js 的基本使用方法:
- 使用装饰器定义控制器和路由
- 实现依赖注入
- 模块化组织代码
- 实现基本的 CRUD 操作
Nest.js 的强大之处远不止于此,它还支持:
- 数据库集成(TypeORM, Mongoose 等)
- 身份认证和授权
- 文件上传
- WebSocket
- 微服务
- 等等
建议在掌握基础后,进一步探索这些高级特性,以充分发挥 Nest.js 的潜力。