如何在Cloudflare Pages服务端运行node pg连接CockroachDB
在SvelteKit(Cloudflare环境)中直接使用pg包优化数据库调用
可行方案:通过适配包/Polyfill让pg在Cloudflare Worker运行
Cloudflare Workers不支持Node.js原生的net模块(pg依赖该模块建立TCP连接),但可以通过以下两种方式解决:
方式1:使用pg-cloudflare适配包
这是专门为Cloudflare环境封装的pg客户端,无需手动Polyfill,直接替换原pg的Client即可:
- 安装依赖:
npm install pg pg-cloudflare - 在
+page.server.ts中改写你的逻辑:import { Client } from 'pg-cloudflare'; import format from 'pg-format'; export async function load({ url }) { // 从请求URL获取参数 const id = url.searchParams.get('id') ?? null; const limit = parseInt(url.searchParams.get('limit') || '20'); const offset = parseInt(url.searchParams.get('offset') || '0'); // 构建查询语句 let query = format('Select * FROM outputs ORDER BY date_created DESC LIMIT %L OFFSET %L', limit, offset); if (id) { query = format(`SELECT * from outputs WHERE _id = %L`, id); } const dbClient = new Client(process.env.DATABASE_URL); try { await dbClient.connect(); const dbResponse = await dbClient.query(query); return { recipes: dbResponse.rows }; } catch (e) { return { error: '请求出错,请刷新重试' }; } finally { await dbClient.end(); } }
方式2:手动Polyfill Node.js API
如果坚持使用官方pg包,需要Polyfillnet、tls等Node.js核心模块:
- 安装依赖:
npm install pg node-stdlib-browser bufferutil utf-8-validate - 在
vite.config.ts中配置Polyfill规则:import { sveltekit } from '@sveltejs/kit/vite'; import { defineConfig } from 'vite'; import nodePolyfills from 'rollup-plugin-node-polyfills'; export default defineConfig({ plugins: [ sveltekit(), nodePolyfills({ include: ['net', 'tls', 'util'], globals: { Buffer: true, } }) ] }); - 配置完成后,即可在
+page.server.ts中直接使用官方pg包,逻辑与你原Lambda代码基本一致。
解决@supabase/postgrest-js的FetchError错误
你遇到的FetchError: Request cannot be constructed from a URL that includes credentials:是因为Cloudflare的Fetch API禁止URL中包含明文凭证(如postgrest://user:pass@host格式)。解决方法:
- 拆分连接参数,通过请求头传递凭证,避免URL带敏感信息:
import { createClient } from '@supabase/postgrest-js'; const postgrest = createClient( 'https://your-postgrest-instance.com', '', // 空占位符,凭证通过headers传递 { headers: { Authorization: `Bearer ${process.env.SUPABASE_SERVICE_ROLE_KEY}`, apikey: process.env.SUPABASE_SERVICE_ROLE_KEY } } );
关键注意事项
- Cloudflare Workers是无状态环境,不要使用pg的Pool连接池,每次请求创建单独的Client并在请求结束后关闭,避免连接泄漏。
- 数据库连接字符串务必存在SvelteKit环境变量中(
.env文件,需添加到.gitignore),禁止硬编码。 - 若数据库部署在私有网络,需配置Cloudflare Tunnel或VPC peering,确保Worker能访问数据库端口。
内容的提问来源于stack exchange,提问作者Joel Hager
相关产品推荐
相关产品推荐

