构建项目管理后端
我正在为 CodeAlpha 的实习项目开发一个协作式项目管理工具。
它的功能类似于简化版的 Trello 或 Asana。用户可以创建项目、邀请成员,并在不同的看板之间移动任务。我使用 Express.js、Prisma 和 Socket.io 来驱动它。
以下是我在构建后端过程中学到的技术经验。
管理数据关系
用户和项目之间是多对多关系。我使用一个 ProjectMember 表来连接它们。该表还存储了用户角色等额外数据。
我为该表添加了一个唯一约束(unique constraint)。这确保了每个用户在每个项目中仅出现一次,同时也创建了一个用于快速查询的复合键(composite key)。
对于看板(Kanban board),我保持了逻辑的简洁。任务状态由它所属的看板决定。将任务从“待办”(To Do)移动到“已完成”(Done),只需更新其 board ID 即可。
架构错误
我在数据库连接方面吸取了一个深刻的教训:不要在每个路由文件中都创建一个新的 PrismaClient。这会产生过多的连接,导致应用程序崩溃。
相反,应该在单个文件中创建一个共享实例,然后在每个路由中导入该实例。这样可以保持连接池(connection pool)的稳定。
授权与安全
我使用 protect 中间件来保护路由。它会检查 Authorization 请求头中的 JWT。
在读取请求头时,我使用了可选链(optional chaining)。这可以防止在请求头缺失时导致应用程序崩溃。
在这个项目中,我使用了有效期为 7 天的访问令牌(access token)。虽然生产环境的应用通常使用短效令牌和刷新令牌(refresh tokens),但对于目前的开发范围,长效令牌已经足够。
通过事务保证数据完整性
创建项目需要三个步骤:
- 创建项目记录
- 分配所有者
- 创建默认看板
如果其中一个步骤失败,数据就会变得不一致。我使用 prisma.$transaction 来封装这些步骤。如果任何一部分失败,整个过程都会回滚(rollback),从而保持数据库的整洁。
常见的逻辑错误
我遇到了两个常见的 Bug:
关系数组(Relation Arrays):当你在查询中包含关系(relations)时,Prisma 会返回一个数组。你不能直接在关系对象上访问属性,必须先获取数组中的第一个元素。
路由顺序:Express 从上到下匹配路由。如果你将带有参数的路由放在特定路由之前,Express 将会匹配到错误的路由。务必将特定路由放在参数化路由之上。
这些后端模式现在已成为我工作流的一部分。