You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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
        }
      }
    );
    

关键注意事项

  1. Cloudflare Workers是无状态环境,不要使用pg的Pool连接池,每次请求创建单独的Client并在请求结束后关闭,避免连接泄漏。
  2. 数据库连接字符串务必存在SvelteKit环境变量中(.env文件,需添加到.gitignore),禁止硬编码。
  3. 若数据库部署在私有网络,需配置Cloudflare Tunnel或VPC peering,确保Worker能访问数据库端口。

内容的提问来源于stack exchange,提问作者Joel Hager

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 21:15:24