node-postgres (pg) 写入和读取行的 TypeScript Worker,通过 wrangler dev 在本地运行,并将其部署到 workers.dev。
前置条件
- 一个 Cloudflare 账户。Workers 免费版和付费版套餐均可使用 Hyperdrive。
- Node.js 20 或更高版本。本指南已在 Node.js 24.21.0、Wrangler 4.145.0、
create-cloudflare2.73.1、pg8.23.1 和 Postgres 18 环境下测试通过。 - 一个 ClickHouse Cloud 账户。
psql,用于创建数据库和表。您也可以在 SQL 控制台中运行这些 SQL 语句。
创建 ClickHouse Managed Postgres 服务
在 ClickHouse Cloud 控制台中,点击 New service,然后选择 Postgres。实例会在几分钟内准备就绪。完整操作步骤请参阅快速入门。获取连接详细信息
在服务的左侧边栏中点击 Connect。保持选中 Directly,并开启 Use SSL。此时 URL 会以sslmode=verify-full&sslrootcert=<service-name>-ca-certificate.pem 结尾。点击 Download CA certificate 下载实例的 CA 证书。也可以在 Settings → CA Certificate 中下载。
本指南让 Hyperdrive 使用端口 5432 上的直接连接,而不是端口 6432 上内置的 PgBouncer:
- Hyperdrive 本身就是一个以事务模式运行的连接池器。它会与数据库维持少量长连接,并在所有 Worker 请求之间共享这些连接,而这原本正是 PgBouncer 的职责。Cloudflare 建议为 Hyperdrive 配置直接连接字符串,而非经过连接池的连接字符串。
- 让 Hyperdrive 连接端口
6432同样可行,但串联两个事务模式连接池会多一次网络跳转,还多出一处需要调优连接池大小的地方,却无法提升容量。 - 在 Workers Free 计划下,每个 Hyperdrive 配置最多打开约 20 个连接;在 Paid 计划下约为 100 个,均在默认
max_connections(500) 的范围之内。如果同一实例上还有多个 Hyperdrive 配置或其他客户端,请将它们的连接数累加计算,必要时在 Settings 中调整max_connections,或在 Hyperdrive 中调整源端连接数上限。
如果使用了 IP 访问列表,由于 Hyperdrive 从 Cloudflare 的 IP 地址范围发起连接,必须将这些地址范围加入允许列表。
创建数据库
将下载的证书重命名为ca-certificate.pem,然后创建一个数据库和一张 notes 表。将 <PASSWORD> 和主机地址替换为 Connect 对话框中提供的值:
创建 Worker 项目
使用create-cloudflare 基于 “Hello World” 模板创建一个 TypeScript Worker,然后安装 pg:
ca-certificate.pem 移至项目目录中。如果您之前未使用过 Wrangler,请运行 npx wrangler login,通过您的 Cloudflare 账户为其授权。
创建 Hyperdrive 配置
Hyperdrive 始终会加密与数据库之间的连接,但默认情况下不会使用实例的 CA 来校验证书。若要实现与sslmode=verify-full 等效的效果,请先将 CA 证书上传到您的 Cloudflare 账户:
ID 创建 Hyperdrive 配置。连接字符串使用端口 5432 和 guide_cloudflare 数据库,不包含任何 SSL 参数;TLS 改为通过 --sslmode 和 --ca-certificate-id 配置:
--sslmode verify-full 时,它会检查服务器证书是否由您上传的 CA 签名,以及证书是否与主机名匹配。只要有一项检查未通过,命令就会失败并报错 (例如 cert verification failed - unable to get local issuer certificate) ,且不会创建任何配置。密码保存在您 Cloudflare 账户下的 Hyperdrive 配置中,而不是保存在您的项目里。
--binding HYPERDRIVE --update-config 会将该配置添加到 wrangler.jsonc 中,使您的 Worker 可以通过 env.HYPERDRIVE 访问它。如果您的项目使用的是 wrangler.toml,Wrangler 不会修改该文件;此时请将命令输出的 [[hyperdrive]] 代码片段手动粘贴到该文件中。
配置 Worker
pg 依赖 Node.js 兼容层。打开 wrangler.jsonc,在 compatibility_date 旁添加 nodejs_compat 标志。修改后,文件的相关部分如下所示:
wrangler.jsonc
wrangler.toml 文件,则应改为在 compatibility_date 下方添加 compatibility_flags = ["nodejs_compat"]。如果该文件中已有 compatibility_flags,请将 nodejs_compat 添加到该列表中。
重新生成 TypeScript 类型,使 env.HYPERDRIVE 具有明确的类型:
@cloudflare/workers-types 包,运行 wrangler types 时会输出说明,指导您如何改用生成的类型。
查询数据库
将src/index.ts 替换为一个 Worker:它在收到 POST /notes 请求时创建一条笔记,在收到 GET /notes 请求时列出所有笔记。如果使用的是现有 Worker,则改为在 fetch 处理程序中添加相同的 /notes 处理逻辑:
src/index.ts
env.HYPERDRIVE.connectionString 指向的是 Hyperdrive,而不是您的实例。Worker 与 Hyperdrive 之间的链路完全位于 Cloudflare 内部,因此无需配置 SSL 参数。到 Postgres 的 TLS 连接 (含证书验证) 由 Hyperdrive 负责处理。
Hyperdrive 以事务模式运行,与 PgBouncer 类似:每个事务都可能使用不同的 Postgres 连接。
pg 的参数化查询、事务以及命名预处理语句均可正常使用。请勿在多个查询之间依赖会话状态 (例如会话级别的 SET) ,而应在事务内改用 SET LOCAL。在本地运行
wrangler dev 会在您的本机上运行 Worker。在本地运行时,Hyperdrive 不会对连接进行池化,binding 会直接连接到 CLOUDFLARE_HYPERDRIVE_LOCAL_CONNECTION_STRING_<BINDING> 中指定的数据库。请将该变量设置为直连的连接字符串,并在其中包含 sslmode=verify-full 和 CA 证书的路径,然后启动 Worker:
sslrootcert 的路径相对于你运行 wrangler dev 时所在的目录进行解析。
在另一个终端中创建一条笔记:
pg 会将 bigint 列以字符串形式返回,因此 id 的值是 "1",而不是 1。
部署
部署工作线程:workers.dev 子域名。通过已部署的 Worker 创建一条笔记:
https://hyperdrive-notes.<your-subdomain>.workers.dev/notes,即可看到这两条笔记。返回的响应如下所示:
在控制台中验证
在服务的左侧边栏中打开 SQL 控制台,依次展开guide_cloudflare 和 public,然后点击 notes 表,即可看到这两条笔记:
清理
如需清理你在 Cloudflare 账户中创建的资源,请删除 Worker、Hyperdrive 配置以及 CA 证书:wrangler cert delete 提示 Certificate cannot be deleted while in use,请在删除 Hyperdrive 配置后等待一分钟,再重新运行该命令。
后续步骤
- 连接:连接字符串、PgBouncer 和 TLS
- 设置:Postgres 参数,例如
max_connections - 只读副本:扩展读取流量处理能力
- Hyperdrive 文档:查询缓存、连接池调优和可观测性