nextjs部署到cloudflare的数据库连接和调试
约 415 字大约 1 分钟
2025-10-12
nextjs 部署到 cloudflare 的时候,如果直接连接外部数据库 延迟非常大,那么需要用 cloudflare 的 hyperdrive 功能
申请数据库

这里我们申请了一个数据库
绑定数据库
需要在 cloudflare 后台绑定,填写数据库连接字符串 这个连接字符串从 neon 里面获取
绑定数据库需要配置文件里面加上:
[[hyperdrive]]
binding = "your binding name"
id = "your hyperdrive id"
localConnectionString = "your hyperdrive local connection string"代码实现
代码这块功能需要实现部署到 cloudflare 的时候就使用绑定 本地启动 nextjs 的时候,使用第三方数据库直接连接
import { drizzle } from "drizzle-orm/postgres-js";
import postgres from "postgres";
import { getCloudflareContext } from "@opennextjs/cloudflare";
// Detect if running in Cloudflare Workers environment
const isCloudflareWorker =
typeof globalThis !== "undefined" && "Cloudflare" in globalThis;
// Database instance for Node.js environment
let dbInstance: ReturnType<typeof drizzle> | null = null;
export function db() {
let ctx = null;
let databaseUrl = process.env.DATABASE_URL;
if (!databaseUrl) {
throw new Error("DATABASE_URL is not set");
}
// In Cloudflare Workers, create new connection each time
if (isCloudflareWorker) {
ctx = getCloudflareContext();
//第三方数据库
databaseUrl = ctx.env.MY_BINDING.connectionString;
console.log("databaseUrl: ", databaseUrl);
// Workers environment uses minimal configuration
const client = postgres(databaseUrl, {
prepare: false,
max: 1, // Limit to 1 connection in Workers
idle_timeout: 60, // Shorter timeout for Workers
connect_timeout: 60,
});
return drizzle(client);
}
console.log("使用第三方数据库连接");
console.log("databaseUrl: ", databaseUrl);
// In Node.js environment, use singleton pattern
if (dbInstance) {
return dbInstance;
}
// Node.js environment with connection pool configuration
const client = postgres(databaseUrl, {
prepare: false,
max: 10, // Maximum connections in pool
idle_timeout: 60, // Idle connection timeout (seconds)
connect_timeout: 60, // Connection timeout (seconds)
});
dbInstance = drizzle({ client });
return dbInstance;
}说明: ctx.env.MY_BINDING 这个 MY_BINDING 是 hyperdrive 的名称,比如我绑定的 hyperdrive 名称是 MY_BINDING。
