首页 / 文章 / 在无关联关系或P1001错误的情况下启动NestJS与Prisma API

在无关联关系或P1001错误的情况下启动NestJS与Prisma API

将 NestJS、Prisma 和 PostgreSQL 整合为整洁 API 基础的实用检查清单,以及针对关系错误、P1001 错误和失效 Pull Request 的解决方案。

1069 词

团队后续开发的几乎所有后端功能,从身份验证到多租户架构以及基于角色的访问控制,都建立在项目最初几小时的设置基础之上。如果一开始环境变量、数据库连接、数据结构关系及迁移操作就处理不当,后续的每一个拉取请求都会继承这些问题。本指南将详细介绍如何使用 Prisma 和 PostgreSQL 构建 NestJS API,解释最常导致首个里程碑失败的三类问题,并提供一份清单,帮助你判断基础工作是否真正完成。

完整的初始化应具备什么特征

在接触命令行工具之前先明确目标会很有帮助。当审核者能够克隆该分支并确认以下所有条件时,即表示初始化已完成:

  • 一个用 TypeScript 编写的 NestJS 应用程序,能够无错误启动
  • Prisma 已连接到 PostgreSQL 数据库
  • 配置从环境变量中加载,而非硬编码值
  • 一组反映业务领域的初始数据模型
  • 可顺利应用于空数据库的迁移脚本
  • 结构清晰的拉取请求,便于团队其他成员审查并合并
  • 这些要求被刻意设定得较为严格:仅允许使用 NestJS 和 Prisma 作为框架及 ORM,PostgreSQL 作为数据库,同时配置与 Git 使用方面必须遵循团队现有的规范。

    工具集

    • 框架与语言:NestJS 配合 TypeScript
    • 数据访问:prisma(命令行工具)和 @prisma/client(生成的查询客户端)
    • 配置管理:@nestjs/config
    • 数据库:本地 PostgreSQL 实例
  • 验证:Prisma CLI,以及用于访问端点的浏览器或API客户端
  • 搭建项目框架

    首先使用Nest CLI生成一个新的应用,然后添加Prisma并在项目中进行初始化。初始化后会创建一个用于存储模式文件和迁移文件的prisma/目录,而应用程序代码则保存在src/目录中。

    接着创建一个包含DATABASE_URL.env文件,Prisma会读取该文件中的PostgreSQL连接字符串。通过@nestjs/config模块加载配置,这样应用程序就能从环境变量中获取值,而非代码中散落的硬编码值。务必将.env文件加入.gitignore列表;在第一个PR中就提交真实的凭证是个很容易犯的错误,而且很难挽回。

    在编写任何模型之前,先确认 Prisma 能够成功连接到数据库。如需更深入地了解 Prisma 的相关内容,可参阅在 TypeScript Node.js 项目中使用 PostgreSQL 配置 Prisma 7,同时请查看最新的 Prisma 文档以获取针对特定版本的详细信息。

    建模第一个实体

    对于多租户产品,一个合理的初始架构包含四个模型:

    • Tenant,表示使用该系统的组织
    • User,表示登录系统的人员
    • Role,用于在租户内部进行基本的角色分配
    • Invite,用于将新用户引入租户

    它们共同决定了后续功能所依赖的基础:用户属于某个租户,拥有特定角色,并通过邀请方式加入。每一种关系都需要在双方都存在对应的字段,而这正是下面第一个错误的根源。

    一旦架构得到验证,就执行初始迁移,使数据库结构与架构保持一致。请避免在其中进行任何实验性操作,因为每位团队成员都需在本地应用该结构。

    添加健康检查端点

    在 API 端,添加一个控制器来公开 /health 接口,该接口返回简单的 OK 响应。这看似很简单,但实际上有着重要意义:它为你、你的持续集成流程,以及最终的负载均衡器或编排工具提供了一种低成本的方式,用于判断相关进程是否正在运行并能够处理请求。

    常阻碍首个里程碑实现的三种错误

    Prisma 会拒绝没有对应字段的关系定义

    症状:模式验证失败,提示某个关联关系缺少对应的字段。

    原因:Prisma要求在两个模型中都声明关联关系。如果User指向Tenant,但Tenant没有用于列出其用户的字段,从Prisma的角度来看该模式就是不完整的。

    解决方法:在相关的模型中添加缺失的反向引用字段,然后运行prisma format。该工具会规范化文件并自动补充缺失的关联字段,因此每次修改模式后都运行它是个好习惯。

    P1001:无法连接到数据库服务器

    症状:Prisma返回错误代码P1001,无法连接到PostgreSQL。

    原因:通常有两种可能。要么 PostgreSQL 服务器未运行,要么 DATABASE_URL 中指定的端口与服务器监听的端口不一致。

    解决方法:先确认数据库进程在本地正在运行,然后将连接字符串中的主机和端口与服务器的实际配置进行比对。

    看似会删除所有内容的拉取请求

    症状:审核者打开该拉取请求后,发现仓库中的所有文件都被删除了。

    原因:该提交是从错误的 Git 状态进行的,因此差异对比的内容与预期大相径庭。

    解决方案:不要试图修复混乱的历史记录,而应从正确的基准分支创建一个新分支,仅重新应用所需的更改。在推送之前运行 git status 并查看与目标分支的 git diff,可以及早发现这类错误。

    验证设置

    验证过程应当是极其重复且可预测的:

    • 运行 npx prisma migrate dev,确认迁移过程无错误地完成
    • 启动 NestJS 服务器
    • 在浏览器或 API 客户端中访问 /health,检查是否返回 OK 响应

    当迁移顺利完成且健康检查端点能正常响应时,就为开发下一个功能打好了基础。

    关键要点

    • 应将启动代码视为具有明确验收标准的交付物,而非可随意丢弃的临时框架。
  • 在数据模型的两侧都声明所有的 Prisma 关系,并让 prisma format 帮助保持架构整洁。
  • 看到 P1001 时,在进行其他调试之前,先确认 PostgreSQL 正在运行且 DATABASE_URL 中的端口是正确的。
  • 实现一个健康检查端点只需几分钟,却能在 CI、监控和部署检查中带来巨大好处。
  • 历史记录清晰、范围明确的小型拉取请求是工程工作的一部分,而非事后才考虑的事。
  • 相关阅读