问题排查

定位常见的安装、集成、内容与部署故障。

先用最小命令复现问题,阅读第一条有意义的错误,并在配置源头修复。排查时不要提交 .env、生成的 .source 或本地构建产物。

安装与构建

症状常见原因检查位置安全修复
pnpm install 大量改依赖或拒绝 lockfile包管理器/版本错误,或 lockfile 被修改package.jsonpnpm-lock.yaml使用 pnpm 和 pnpm install;不要一上来就删除 lockfile
pnpm lint 报格式问题Biome 诊断报错文件、biome.json运行 pnpm format,检查 diff,再运行 pnpm lint
pnpm build 找不到 alias/module依赖缺失、大小写错误或生成内容过期导入路径、tsconfig.jsonpackage.json修正导入/依赖;若来自 .source,重新生成 Fumadocs 内容
开发正常但生产构建失败服务端渲染读到无效 env/数据,或 Client/Server 边界错误构建输出中第一个失败路由本地运行 pnpm build 并修复该路由,不要压制错误

参见安装部署

PostgreSQL 与 Drizzle

症状常见原因检查位置安全修复
连接被拒绝/超时PostgreSQL 未启动、主机/端口错误或托管数据库阻止网络DATABASE_URL、提供商网络策略用 PostgreSQL 客户端测试同一 URL;先修连通性再改 schema
认证失败或数据库不存在用户/密码/库名错误,常见于特殊字符转义DATABASE_URL从提供商重新复制 URL;手写时对凭据做 URL 编码
relation ... does not existschema 未应用到当前数据库drizzle.config.tssrc/lib/db/schema/确认目标库,再为本地/模板设置运行 pnpm exec drizzle-kit push
修改 auth schema 后认证故障Better Auth adapter 预期与 Drizzle 表不一致src/lib/auth.tssrc/lib/db/schema/auth.ts有计划地同步 schema,并应用到正确数据库
生产连接过多每实例连接池总量超过提供商限制src/lib/db/index.ts、托管池配置使用池化 PostgreSQL 端点,并按总实例并发调整连接数

模板没有已提交的迁移历史,不要假设 drizzle-kit migrate 已可直接使用。参见 数据库

Better Auth、Cookie 与重定向

症状常见原因检查位置安全修复
登录成功仍跳到 /auth/loginCookie 缺失、属于其他 origin,或 HTTP/HTTPS/域名不一致浏览器 Cookie、BETTER_AUTH_URL、请求主机统一规范 origin,设置正确 URL,并清除旧 Cookie
Auth 端点返回服务端错误secret 缺失/过弱,或数据库/邮件故障BETTER_AUTH_SECRET、服务端日志、数据库/Resend 配置生成强 secret,修复下游服务并重启
以为 proxy 会保护 API,但 API 仍可访问src/proxy.ts 仅按 Cookie 重定向页面,且跳过 /apiRoute Handler 认证代码在每个受保护服务端边界调用 auth.api.getSession({ headers: await headers() })
本地正常,反向代理后失败对外 origin/协议与认证 URL 不同转发 host/proto、BETTER_AUTH_URL配置规范 HTTPS URL 和平台可信代理头

参见身份认证

OAuth 回调

症状常见原因检查位置安全修复
提供商提示 callback/redirect 不匹配注册 URL 的主机、协议、端口、locale 或 provider 不同OAuth 控制台、BETTER_AUTH_URL精确注册 {BETTER_AUTH_URL}/api/auth/callback/{provider}
OAuth 按钮立即失败Client ID/secret 缺失或来自另一应用/环境GITHUB_*GOOGLE_*、提供商控制台使用匹配的凭据对,修改 env 后重启
账户关联结果意外多个提供商邮箱相同且启用了 linkingsrc/lib/auth.ts修改前审查模板关联策略,并用已有账户测试

Resend 邮件

症状常见原因检查位置安全修复
验证/重置/联系表单发送报错RESEND_API_KEY 缺失、无效或被提供商拒绝服务端日志、.envsrc/lib/email/使用有效的服务端 key,并用允许的收发件地址重试
测试发件人可用,自有域名不可用域名/DNS 未验证,或 fromEmail 域名错误Resend 域名状态、website-config.ts验证 DNS,再使用该域名下的发件地址
已接受但未送达垃圾邮件、退信、抑制列表或收件人问题Resend 投递事件检查提供商事件;永久退信不要无限重试

参见邮件

Creem 结账与 Webhook

症状常见原因检查位置安全修复
创建结账失败sandbox/live key、server index 与产品 ID 不属于同一环境CREEM_SERVER_IDXCREEM_API_KEYNEXT_PUBLIC_CREEM_PRODUCT_*使用同一环境的 key/产品 ID;改公开 ID 后重新构建
Webhook 返回 401 Invalid signaturesecret 错误、缺少 creem-signature 或 body 被代理改写CREEM_WEBHOOK_SECRET、端点/日志复制同一 Creem 端点的 secret,让提供商原始请求直接到达路由
Webhook 返回配置 500运行时没有 secret运行时 env在实际部署设置 CREEM_WEBHOOK_SECRET 并重启/重部署
支付成功但 UI 不变事件未处理、Webhook 未送达或仪表盘仍为 mockCreem 投递日志、/api/payment/notify/creem、数据库行重放已验证 sandbox 事件,检查订单/订阅行,并让 UI 读取真实数据

Webhook 必须使用精确路径 /api/payment/notify/creem。参见 支付

OpenAI 聊天

症状常见原因检查位置安全修复
API key 缺失/无效未设置或设置了错误的 OPENAI_API_KEY服务端 env 与路由日志设置有效的服务端 key 并重启
找不到/不支持模型客户端选择器或请求模型无法由当前提供商调用ChatBot.tsx/api/chat 请求选择支持的模型,并在服务端执行相同白名单
Search 开关没有网页结果当前代码只发送 tools: {}src/app/api/chat/route.ts配置真实服务端搜索工具,或移除/禁用开关
流中断但 UI 反馈很少提供商/连接错误没有映射为产品错误状态网络响应和服务端日志添加结构化流错误、超时与用户安全提示

参见 AI 聊天

Replicate 媒体

症状常见原因检查位置安全修复
提供商“未配置”惰性工厂创建时没有 REPLICATE_API_TOKEN运行时 env、src/lib/ai/*/index.ts设置令牌并重启进程
创建 prediction 返回 500模型 ID 或模型专属输入映射错误路由日志、provider 实现、Replicate 错误对照模型 schema 检查 createTask();不要盲传 UI 选项
轮询一直不结束远程任务慢/卡住、未知状态,或客户端无总超时/query 响应、Replicate 任务在 Replicate 检查任务;增加有上限的退避、超时、取消与持久化
成功但看不到媒体输出结构未识别,或提供商 URL 过期/CORS 阻止下载taskInfo.output、URL 提取器扩展对应提取器;把最终资源复制到自有对象存储

参见 AI 媒体生成

Fumadocs 与 MDX

症状常见原因检查位置安全修复
集合导入或 .source 类型缺失生成目录缺失/过期.source/source.config.tstsconfig.json停止 dev,删除 .source/,运行 pnpm devpnpm build
构建提示 frontmatter 无效schema 必填字段类型/格式错误失败 MDX、source.config.ts修正 frontmatter;日期用 YYYY-MM-DD,标签用数组
文档 404 或未出现在导航文件/翻译缺失,或 meta.json slug 错误content/docs/、最近的 meta.json创建页面对,并让文件名与导航 slug 完全一致
MDX 组件未定义该渲染器收到的映射中没有组件mdx-components.tsx、docs/blog/legal 页面注册共享组件映射,并传给相应渲染器

不要手改 .source。参见内容

国际化路由

症状常见原因检查位置安全修复
/en/... 被重定向或链接不一致默认英文使用 localePrefix: "as-needed"src/i18n/routing.ts、导航 helpers使用 @/i18n/navigation;英文无 /en,中文有 /zh
新 locale 404只在一个位置加入 locale,或消息/内容缺失routing、request 配置、messages、proxy regex更新所有 locale 列表,提供消息/内容后再链接
API 请求意外带 localeAPI 被 locale middleware 处理src/proxy.ts matcher/API 提前返回保持 /api 不经过 locale 处理

参见国际化

Docker

症状常见原因检查位置安全修复
容器因缺少 server.js 退出未启用 standalone 输出,或复制了错误阶段/产物next.config.mjs、Docker 构建日志保留 output: "standalone",重新构建提供的多阶段 Dockerfile
容器运行但连不上 PostgreSQLlocalhost 指向容器自身运行时 DATABASE_URL、Docker 网络使用数据库服务名/host gateway,并从同一网络测试
修改运行时 env 后公开配置仍旧NEXT_PUBLIC_* 已在 pnpm build 内联builder 阶段 env、部署产物构建时提供公开值,并重新构建镜像
上传文件消失public/uploads 位于临时/被替换容器上传路由、volume改用持久对象存储;仅挂 volume 仍需处理多实例

参见部署文件存储

Next.js 16 检查项

  • 异步请求 API:paramssearchParams 声明为 Promise 并 awaitheaders()cookies() 也要 await
  • 使用 proxy.ts,不是 middleware.ts 模板采用 Next.js 16 proxy 约定, 不要照旧教程再添加一份 legacy middleware。
  • Server/Client 边界: Client Component 不能是 async;浏览器 Hook 需要 "use client";服务端传到客户端的 props 必须可序列化;secret/数据库代码留在服务端。
  • 构建期公开变量: 构建后修改 NEXT_PUBLIC_* 不会更新浏览器 bundle,必须 重新构建并部署。

若问题仍存在,请记录失败命令、第一条相关堆栈、路由、HTTP 状态/响应,以及脱敏后的 环境变量名称(不要记录 secret 值)。这些信息通常足以让下一轮排查快速收敛。

On this page