跳转到内容
搜索文档

连接到私有数据库

最后更新 查看 MarkdownAgent 设置

本示例演示了如何使用 Workers VPCHyperdrive 从 Worker 查询私有 PostgreSQL 数据库。该 Worker 会连接到未暴露在公共互联网上的数据库,并由 Hyperdrive 提供连接池和查询加速功能。

先决条件

  • 在您的私有网络中运行的 PostgreSQL 数据库(例如,在端口 5432 上)
  • 一个连接到运行数据库的私有网络的 Cloudflare Tunnel
  • 具有 Workers VPC 访问权限的 Cloudflare 账户

1. 设置 Cloudflare Tunnel

如果您在数据库所在的同一网络中尚未运行隧道,请创建一个。

  1. 转到 Workers VPC 仪表板,选择 Tunnels(隧道) 标签页。

  2. 选择 Create(创建) 以创建隧道。

  3. 输入隧道名称并选择 Save tunnel(保存隧道)

  4. 选择您的操作系统和架构。仪表板将提供安装说明。

  5. 按照提供的命令下载、安装并使用您的唯一令牌运行 cloudflared

该隧道必须能够从私有网络内部访问您的数据库主机和端口。有关完整的隧道文档,请参阅 Workers VPC 的 Cloudflare Tunnel

2. 创建 TCP VPC Service

创建一个指向您的数据库且类型为 tcp 的 VPC Service:

npx wrangler vpc service create my-postgres-db \
  --type tcp \
  --tcp-port 5432 \
  --app-protocol postgresql \
  --tunnel-id <YOUR_TUNNEL_ID> \
  --ipv4 <YOUR_DATABASE_IP>

<YOUR_TUNNEL_ID> 替换为步骤 1 中的隧道 ID,并将 <YOUR_DATABASE_IP> 替换为您数据库的私有 IP 地址(例如 10.0.0.5)。

该命令会返回一个服务 ID。保存此值供下一步使用。

3. 创建 Hyperdrive 配置

使用 --service-id 标志将 Hyperdrive 指向您创建的 VPC Service:

npx wrangler hyperdrive create my-vpc-database \
  --service-id <YOUR_VPC_SERVICE_ID> \
  --database <DATABASE_NAME> \
  --user <DATABASE_USER> \
  --password <DATABASE_PASSWORD> \
  --scheme postgresql

<YOUR_VPC_SERVICE_ID> 替换为步骤 2 中的服务 ID,并提供您的数据库名称、用户和密码。

该命令会输出一个 Hyperdrive 配置 ID。复制此值供下一步使用。

4. 将 Hyperdrive 绑定到 Worker

你必须在 Wrangler 配置文件 中创建绑定,Worker 才能连接 Hyperdrive 配置。绑定(binding) 使 Worker 能够访问 Cloudflare 开发者平台上的资源(如 Hyperdrive)。

要将 Hyperdrive 配置绑定到 Worker,请在 Wrangler 文件末尾添加以下内容:

{
	"hyperdrive": [
		{
			"binding": "HYPERDRIVE",
			"id": "<YOUR_DATABASE_ID>" // the ID associated with the Hyperdrive you just created
		}
	]
}
[[hyperdrive]]
binding = "HYPERDRIVE"
id = "<YOUR_DATABASE_ID>"

具体说明:

  • binding(绑定名称)设置的值(字符串)将在 Worker 中引用此数据库。本教程中将绑定命名为 HYPERDRIVE
  • 绑定必须是有效的 JavaScript 变量名。例如 binding = "hyperdrive"binding = "productionDB" 均为有效名称。
  • 绑定在 Worker 中可通过 env.<BINDING_NAME> 访问。

若开发时使用本地数据库,可在 Hyperdrive 配置中添加 localConnectionString,填入数据库连接字符串:

{
	"hyperdrive": [
		{
			"binding": "HYPERDRIVE",
			"id": "<YOUR_DATABASE_ID>", // the ID associated with the Hyperdrive you just created
			"localConnectionString": "<LOCAL_DATABASE_CONNECTION_URI>"
		}
	]
}
[[hyperdrive]]
binding = "HYPERDRIVE"
id = "<YOUR_DATABASE_ID>"
localConnectionString = "<LOCAL_DATABASE_CONNECTION_URI>"

5. 查询数据库

安装 node-postgres 驱动:

npm i pg@>8.16.3

若使用 TypeScript,安装类型包:

npm i -D @types/pg

wrangler.jsonc 中添加所需的 Node.js 兼容性标志和 Hyperdrive 绑定:

wrangler.jsonc 中添加 Node.js 兼容性标志和 Hyperdrive 绑定(binding):

{
	// required for database drivers to function
	"compatibility_flags": [
		"nodejs_compat"
	],
	// Set this to today's date
	"compatibility_date": "2026-08-17",
	"hyperdrive": [
		{
			"binding": "HYPERDRIVE",
			"id": "<your-hyperdrive-id-here>"
		}
	]
}
compatibility_flags = [ "nodejs_compat" ]
# Set this to today's date
compatibility_date = "2026-08-17"

[[hyperdrive]]
binding = "HYPERDRIVE"
id = "<your-hyperdrive-id-here>"

创建新的 Client 实例并传入 Hyperdrive connectionString

// filepath: src/index.ts
import { Client } from "pg";

export default {
	async fetch(
		request: Request,
		env: Env,
		ctx: ExecutionContext,
	): Promise<Response> {
		// Create a new client instance for each request. Hyperdrive maintains the
		// underlying database connection pool, so creating a new client is fast.
		const client = new Client({
			connectionString: env.HYPERDRIVE.connectionString,
		});

		try {
			// Connect to the database
			await client.connect();

			// Perform a simple query
			const result = await client.query("SELECT * FROM pg_tables");

			return Response.json({
				success: true,
				result: result.rows,
			});
		} catch (error: any) {
			console.error("Database error:", error.message);

			return new Response("Internal error occurred", { status: 500 });
		}
	},
};

6. 部署并测试

部署您的 Worker:

npx wrangler deploy

发送请求以验证连接:

curl https://<YOUR_WORKER>.<YOUR_SUBDOMAIN>.workers.dev

成功的响应将从您的数据库返回行的 JSON 数组。

后续步骤

这篇文档对您有帮助吗?