NextJS(App Router)中的数据库连接
发布: (2026年1月5日 GMT+8 00:50)
3 min read
原文: Dev.to
Source: Dev.to
介绍
在本文中,我们将探讨一种可靠的方式,将 Next.js 应用(App Router)通过 Prisma ORM 连接到数据库。
什么是 Prisma ORM?
Prisma(对象关系映射)简化了与数据库的交互。与其为 MySQL、PostgreSQL、SQLite 或 MongoDB 编写原始 SQL 查询,你可以使用类型安全的客户端来抽象底层语法。
使用 ORM 的好处
- 无需记住数据库特定的查询语法。
- 减少因小错误导致的调试时间。
- 更容易切换数据库。
在 Next.js App Router 中连接 Prisma
下面是一个简洁且可用于生产环境的 Prisma 客户端设置示例,能够很好地配合 Next.js 的 App Router 使用。
// lib/prisma.ts
import { PrismaClient } from "@/generated/prisma/client";
import { PrismaPg } from "@prisma/adapter-pg";
const globalForPrisma = globalThis as unknown as {
prisma: PrismaClient | undefined;
};
const connectionString = `${process.env.DATABASE_URL}`;
const adapter = new PrismaPg({ connectionString });
export const prisma =
globalForPrisma.prisma || new PrismaClient({ adapter });
if (process.env.NODE_ENV !== "production") {
globalForPrisma.prisma = prisma;
}
工作原理
- 适配器创建 –
PrismaPg从process.env.DATABASE_URL中获取连接字符串。 - 单例模式 – 客户端存储在全局变量 (
globalForPrisma.prisma) 中。- 在生产环境,同一个 Prisma 实例会在同一服务器实例的多个请求之间复用,避免为每个请求创建新的数据库连接。
- 在开发环境,热重载否则会在每次重新加载时创建新客户端。将客户端全局存储可确保在开发期间只打开一个连接。
为什么需要这些额外代码?
当 Next.js 应用部署后,可能会并发运行多个服务器实例。每个实例可以处理大量传入请求,但我们不希望为每个请求都建立单独的数据库连接。
- 模块缓存:导入 Prisma 客户端模块时,会复用同一服务器实例上已经创建的实例。
- 全局存储(开发):开发模式下的热模块替换会在每次重新加载时实例化新客户端,导致大量不必要的连接。全局缓存可以防止这种情况。
遵循此模式,你可以在保持 Prisma 类型安全 API 的同时,将活跃的数据库连接数保持在较低水平。