Next.js 14构建阶段为何会尝试连接数据库?
为什么Next.js 14构建时会尝试连接数据库并导致失败?
核心原因是Next.js 14 App Router的预渲染机制,具体分为两点:
服务器组件的预渲染执行
你的Dashboard是服务器组件,默认情况下Next.js在npm run build阶段会预渲染所有服务器组件,生成静态HTML或路由缓存。这意味着构建时会执行组件内的所有代码,包括await db.query.documents.findFirst()这个数据库查询操作,自然会触发数据库连接。如果数据库未运行,查询失败就会导致构建中断。Drizzle初始化时的Schema校验
在lib/db.js中,你用Drizzle包装连接池创建db实例时,Drizzle默认会对传入的数据库连接做Schema校验——也就是核对你定义的@/schema和数据库实际表结构是否一致。这个校验过程会尝试建立数据库连接,而lib/db.js在服务器组件被import时就会加载执行,所以构建阶段就会触发这个连接动作。
避免构建时依赖数据库的方案
- 将数据库查询逻辑移到Server Actions或API路由中,这些代码只会在请求时执行,不会在构建阶段运行;
- 在服务器组件中添加
export const dynamic = 'force-dynamic',强制开启动态渲染,让Next.js不在构建阶段预渲染该组件,改为每次请求时再执行组件代码; - 调整Drizzle初始化配置,禁用构建时的Schema校验(比如设置
mode: 'production',具体可参考Drizzle官方配置说明)。
内容的提问来源于stack exchange,提问作者user3357926
相关产品推荐
相关产品推荐

