You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跳转仪表盘遇Prisma数据库连接错误,求排查API限额逻辑

数据库连接错误排查:仪表盘跳转失败并触发API限额检查报错

问题描述

跳转至仪表盘时触发报错,原本逻辑是检查用户订阅状态以确保API调用次数不超过MAX_FREE_COUNTS,但未完成跳转就触发数据库连接错误。

API限额实现代码

import { auth } from "@clerk/nextjs";

import prismadb from "@/lib/prismadb";
import { MAX_FREE_COUNTS } from "@/constants";

export const incrementApiLimit = async () => {
  const { userId } = auth();

  if (!userId) {
    return;
  }

  const userApiLimit = await prismadb.userApiLimit.findUnique({
    where: { userId: userId },
  });

  if (userApiLimit) {
    await prismadb.userApiLimit.update({
      where: { userId: userId },
      data: { count: userApiLimit.count + 1 },
    });
  } else {
    await prismadb.userApiLimit.create({
      data: { userId: userId, count: 1 },
    });
  }
};

export const checkApiLimit = async () => {
  const { userId } = auth();

  if (!userId) {
    return false;
  }

  const userApiLimit = await prismadb.userApiLimit.findUnique({
    where: { userId: userId },
  });

  if (!userApiLimit || userApiLimit.count < MAX_FREE_COUNTS) {
    return true;
  } else {
    return false;
  }
};

export const getApiLimitCount = async () => {
  const { userId } = auth();

  if (!userId) {
    return 0;
  }

  const userApiLimit = await prismadb.userApiLimit.findUnique({
    where: {
      userId
    }
  });

  if (!userApiLimit) {
    return 0;
  }

  return userApiLimit.count;
};

Prisma Schema 定义

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mysql"
  url = env("DATABASE_URL")
  relationMode = "prisma"
}

model UserApiLimit {
  id        String      @id @default(cuid())
  userId    String   @unique
  count     Int      @default(0)
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

model UserSubscription {
  id        String      @id @default(cuid())
  userId    String   @unique
  stripeCustomerId       String?   @unique @map(name: "stripe_customer_id")
  stripeSubscriptionId   String?   @unique @map(name: "stripe_subscription_id")
  stripePriceId          String?   @map(name: "stripe_price_id")
  stripeCurrentPeriodEnd DateTime? @map(name: "stripe_current_period_end")
}

触发的错误信息

Error: 
Invalid `prisma.userApiLimit.findUnique()` invocation:


Error querying the database: Server error: `ERROR HY000 (1105): unavailable: unable to connect to branch 8yeh0d8jjckc'

错误原因与修复步骤

核心原因

这个错误是数据库连接失败,提示无法连接到指定分支(8yeh0d8jjckc),和你的API限额逻辑、Schema定义本身无关,核心问题出在数据库连接配置或服务状态上。

排查修复步骤

  1. 核对DATABASE_URL配置
    • 检查.env文件中的DATABASE_URL,确认分支名称(比如PlanetScale数据库的分支)拼写正确,和当前使用的分支一致
    • 如果是PlanetScale,确保已经通过pscale connect命令建立本地连接,或者URL中包含正确的分支访问凭证
  2. 检查数据库分支状态
    • 登录数据库管理平台(如PlanetScale),确认目标分支处于活跃状态,没有被暂停或删除
  3. 同步Prisma与数据库
    • 执行npx prisma generate重新生成客户端,再执行npx prisma db push(开发环境)或npx prisma migrate deploy(生产环境)确保Schema与数据库结构同步
  4. 验证网络连通性
    • 确认本地网络可以访问数据库服务器,没有防火墙、VPN或代理拦截数据库连接请求

代码优化建议

  • incrementApiLimit可以用Prisma的upsert方法简化,减少一次数据库查询:
export const incrementApiLimit = async () => {
  const { userId } = auth();
  if (!userId) return;

  await prismadb.userApiLimit.upsert({
    where: { userId },
    update: { count: { increment: 1 } },
    create: { userId, count: 1 },
  });
};
  • 如果项目中有User模型,建议在UserApiLimit和UserSubscription的userId字段添加@relation关联,增强数据一致性:
model UserApiLimit {
  id        String      @id @default(cuid())
  userId    String      @unique
  user      User        @relation(fields: [userId], references: [id], onDelete: Cascade)
  count     Int         @default(0)
  createdAt DateTime    @default(now())
  updatedAt DateTime    @updatedAt
}

内容的提问来源于stack exchange,提问作者Aman Maddheshiya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 09:04:51