在现代 Web 开发中,API 不仅是前后端通信的桥梁,更是系统能力的对外契约。如何设计一套直观、一致、可预测的接口?RESTful 架构风格提供了最佳答案——它将一切视为资源,通过标准 HTTP 方法表达操作语义。NestJS 凭借其装饰器驱动的路由机制和 TypeScript 的类型安全,让实现 RESTful API 变得既规范又高效。
RESTful 核心:用 HTTP 方法表达意图
REST(Representational State Transfer)强调使用 HTTP 动词的原始语义来操作资源:
- GET:获取资源列表或详情(如
/todos获取所有任务); - POST:创建新资源(如提交表单新增任务);
- PUT:全量更新资源(如替换整个用户资料);
- PATCH:局部更新资源(如仅修改昵称或密码);
- DELETE:删除资源(如移除一条任务)。
这种设计让 API 自解释——开发者看到 DELETE /todos/1,无需文档就能理解其作用。它降低了认知成本,提升了协作效率。
NestJS 控制器:声明式路由定义
在 NestJS 中,控制器通过装饰器将方法映射到具体路由:
@Controller('todos')
export class TodosController {
constructor(private readonly todosService: TodosService) {}
@Get()
getTodos() {
return this.todosService.findAll();
}
@Post()
addTodo(@Body('title') title: string) {
return this.todosService.addTodo(title);
}
@Delete(':id')
deleteTodo(@Param('id', ParseIntPipe) id: number) {
return this.todosService.deleteTodo(id);
}
}
@Controller('todos')定义基础路径/todos;@Get()对应GET /todos,返回任务列表;@Post()处理POST /todos,从请求体提取title创建任务;@Delete(':id')匹配DELETE /todos/123,并通过ParseIntPipe确保id为数字。
这种声明式写法将路由逻辑与业务代码解耦,结构清晰,易于维护。
服务层:专注业务逻辑
控制器只负责协议转换,核心逻辑由服务类处理:
@Injectable()
export class TodosService {
private todos: Todo[] = [
{ id: 1, title: '周五狂欢', completed: false },
{ id: 2, title: '三角洲首胜', completed: true }
];
findAll() {
return this.todos;
}
addTodo(title: string) {
const todo: Todo = {
id: +Date.now(),
title,
completed: false
};
this.todos.push(todo);
return todo;
}
deleteTodo(id: number) {
this.todos = this.todos.filter(todo => todo.id !== id);
return { message: 'Todo deleted', code: 200 };
}
}
服务类通过 @Injectable() 标记,可被 NestJS 容器自动注入到控制器中。它封装了数据操作细节,未来若需接入数据库,只需修改此层,不影响上层 API。
全局数据库模块:统一连接管理
对于真实项目,数据需持久化存储。NestJS 支持通过自定义提供者管理数据库连接:
@Global()
@Module({
providers: [
{
provide: 'PG_CONNECTION',
useValue: new Pool({
user: process.env.DB_USER,
host: process.env.DB_HOST,
database: process.env.DB_NAME,
password: process.env.DB_PASSWORD,
port: parseInt(process.env.DB_PORT || '5432', 10),
})
}
],
exports: ['PG_CONNECTION']
})
export class DatabaseModule {}
使用 @Global() 装饰器使该模块全局可用,其他模块无需重复导入即可注入 PG_CONNECTION。连接配置从环境变量读取,符合安全与部署规范。
类型安全:从接口到运行时
TypeScript 在整个链路中提供强类型保障:
export interface Todo {
id: number;
title: string;
completed: boolean;
}
该接口定义了任务的数据结构。服务返回 Todo[],控制器透传该类型,前端调用时即可获得准确的字段提示。即使未来新增 createdAt 字段,编译器也会提醒所有未适配的地方,避免运行时错误。
结语
NestJS 将 RESTful 原则与工程化实践完美结合。通过语义化的 HTTP 方法、声明式的路由装饰器、分层的服务架构和全局的依赖管理,它帮助开发者构建出结构清晰、类型安全、易于扩展的后端服务。无论是简单的 Todo 应用,还是复杂的微服务系统,这套模式都能提供坚实的基础。在 API 成为产品核心竞争力的今天,掌握这样的设计范式,无疑是每位后端工程师的必备技能。