Skip to content

nextjs部署到cloudflare的数据库连接和调试

约 415 字大约 1 分钟

2025-10-12

nextjs 部署到 cloudflare 的时候,如果直接连接外部数据库 延迟非常大,那么需要用 cloudflare 的 hyperdrive 功能

nextjs 使用 cloudflare 的绑定

申请数据库

https://console.neon.tech

数据库

这里我们申请了一个数据库

绑定数据库

需要在 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。

AI编程训练营

联系勋荣

      - 一对一指导(有效期一年)
      - AI编程,AI项目实战
      - 课程价格:1200元
      - 添加微信codexun咨询