Next.js14集成Auth.js与PostgreSQL时遇Edge Runtime不支持crypto模块错误
解决"The edge runtime does not support Node.js 'crypto' module"错误
问题概述
集成Auth.js与数据库管理角色时触发错误:
"The edge runtime does not support Node.js 'crypto' module"
移除数据库集成后问题消失,更换其他数据库或ORM仍出现相同报错。
相关代码
auth.ts
import NextAuth from "next-auth" import PostgresAdapter from "@auth/pg-adapter" import { Pool } from "pg" import Google from "next-auth/providers/google" const pool = new Pool({ host: process.env.DATABASE_HOST, user: process.env.DATABASE_USER, password: process.env.DATABASE_PASSWORD, database: process.env.DATABASE_NAME, max: 20, idleTimeoutMillis: 30000, connectionTimeoutMillis: 2000, }) export const { handlers, auth, signIn, signOut } = NextAuth({ adapter: PostgresAdapter(pool), providers: [Google], })
middleware.ts
export { auth as middleware } from "@/auth";
错误原因
Next.js Middleware默认运行在Edge Runtime环境,而你使用的数据库客户端(如pg)或其依赖库调用了Node.js专属的crypto模块——该模块在Edge Runtime中无法使用。同时,Auth.js的路由处理器默认也会采用Edge Runtime,结合数据库适配器后就会触发此错误。
解决方案
方案1:强制Auth.js路由使用Node.js Runtime(推荐)
在Auth.js的路由文件(通常为app/api/auth/[...nextauth]/route.ts)中添加运行时配置,指定使用Node.js环境:
export const runtime = "nodejs"; export { handlers } from "@/auth";
此方案无需修改现有数据库客户端,直接让Auth.js的认证逻辑在支持crypto模块的Node.js环境中运行。
方案2:改用Edge兼容的数据库工具
若需保留Edge Runtime特性,可替换为支持Edge环境的数据库客户端或ORM,例如:
- 使用
@vercel/postgres(Vercel官方Postgres客户端,原生兼容Edge) - 使用Drizzle ORM搭配Edge兼容驱动
示例:用@vercel/postgres适配Auth.js
import NextAuth from "next-auth" import PostgresAdapter from "@auth/pg-adapter" import { sql } from "@vercel/postgres" import Google from "next-auth/providers/google" export const { handlers, auth, signIn, signOut } = NextAuth({ adapter: PostgresAdapter(sql), providers: [Google], })
方案3:调整Middleware运行时(不推荐)
仅在必要时考虑将Middleware改为Node.js Runtime(会失去Edge Runtime的性能优势),在middleware.ts顶部添加:
export const runtime = "nodejs";
总结
优先选择方案1,无需大幅修改代码即可解决问题;若需Edge Runtime特性,则采用方案2更换兼容的数据库工具。
内容的提问来源于stack exchange,提问作者Eduardo Arhuata
相关产品推荐
相关产品推荐

