Cloudflare Workers上 Better Auth与 Supabase的连接问题(pg pool、postgres.js、Kysely不稳定或被阻塞)

后端开发 2026-07-10

我正在尝试把 Better Auth 连接到一个 Supabase PostgreSQL数据库,后台运行在 Cloudflare Workers 上,但连接不稳定,偶尔还会被阻塞。


背景信息

  • 运行时:Cloudflare Workers
  • 数据库:Supabase(带事务池的PostgreSQL)
  • 已测试的ORM / 客户端:postgres.js, kysely
  • 认证库:Better Auth

问题

  • 使用Supabase 事务池(pgBouncer) → 工作不稳定(失败率约50%)
  • 使用 postgres.jskysely → 在Cloudflare Workers中经常被阻塞
  • 似乎与 Workers的 TCP连接限制 有关

尝试1:使用PgPool

使用pgPool的连接设置

import { Pool } from "pg";
import "dotenv/config";

const connectionString = process.env.DATABASE_URL;
if (!connectionString) {
    throw new Error ("❌ L'URL de la base de données n'est pas définie. Vérifiez votre fichier .env.")
}

export const database  = new Pool ({
     connectionString,
     max: 10,
     //ssl: { rejectUnauthorized: false }
 });

使用pgPool的 Better Auth设置

import { betterAuth } from "better-auth";
import {database} from "./db.connect.ts";
import "dotenv/config";

export const auth = betterAuth({

  // database: database,

  secret: process.env.BETTER_AUTH_SECRET,

  trustedOrigins: [
      process.env.BETTER_AUTH_URL!,
  ],
// Rest of the configuration

✅ 有时可用 ❌ 随机失败(大约每2 次请求就有一次)

尝试2:直接适配器(无异步)

使用kysely的连接设置

import { Kysely } from "kysely";
import { PostgresJSDialect } from "kysely-postgres-js";
import postgres from "postgres";

const connectionString = process.env.DATABASE_URL!;

export const kysely = new Kysely<any>({
    dialect: new PostgresJSDialect({
        postgres: postgres(connectionString)
    }),
});

使用kysely的 Better Auth设置

import { betterAuth } from "better-auth";
import {kysely} from "./kysely.ts";
import { kyselyAdapter } from "@better-auth/kysely-adapter";


import "dotenv/config";

export const auth = betterAuth({

 database: kyselyAdapter (kysely),

  secret: process.env.BETTER_AUTH_SECRET,

  trustedOrigins: [
      process.env.BETTER_AUTH_URL!,
  ],
// Rest of the configuration

从第二次请求起,Wrangler会返回以下错误:

Error: Cannot perform I/O on behalf of a different request. I/O objects (such as streams, request/response bodies, and others) created in the context of one request handler cannot be accessed from a different request's handler. This is a limitation of Cloudflare Workers which allows us to improve overall performance. (I/O type: Writable)

尝试3:动态适配器

使用kysely的连接设置

import { Kysely } from "kysely";
import { PostgresJSDialect } from "kysely-postgres-js";
import postgres from "postgres";

const connectionString = process.env.DATABASE_URL!;

export function createKysely () {
    return new Kysely<any>({
        dialect: new PostgresJSDialect({
            postgres: postgres(connectionString)
        }),
    });
}

使用kysely的 Better Auth设置

import { betterAuth } from "better-auth";
import {createKysely} from "./kysely.ts";
import { kyselyAdapter } from "@better-auth/kysely-adapter";


import "dotenv/config";

export const auth = betterAuth({

 database : kyselyAdapter (createKysely())

  secret: process.env.BETTER_AUTH_SECRET,

  trustedOrigins: [
      process.env.BETTER_AUTH_URL!,
  ],
// Rest of the configuration

我还尝试了:

  database: {async get() {
    return kyselyAdapter (createKysely()) 
    }
  },

从第二次请求起,Wrangler会返回以下错误:

Error: Cannot perform I/O on behalf of a different request. I/O objects (such as streams, request/response bodies, and others) created in the context of one request handler cannot be accessed from a different request's handler. This is a limitation of Cloudflare Workers which allows us to improve overall performance. (I/O type: Writable)

我猜测的原因

Cloudflare Workers可能:

  • 不正确地支持原生TCP连接
  • 无法可靠地支持连接池(pg / pgBouncer)
  • 需要基于HTTP的数据库驱动

问题

  1. Cloudflare Workers是否能够通过TCP与 postgres.js / Kysely兼容,还是这是预期会失败?
  2. Supabase的 pgBouncer是否应该在无服务器边缘环境中可靠工作?
  3. 在Workers中使用Better Auth与 Supabase的推荐架构是什么?

我是不是应该:

  • 使用Supabase的 HTTP API而不是直接访问数据库?
  • 增加一个Node.js后端作为代理?
  • 切换到无服务器的PostgreSQL驱动(如Neon HTTP驱动)?

任何帮助或可行的做法都将不胜感激 🙏

解决方案

对于从Cloudflare Workers连接SQL数据库,请查看Hyperdrive:

https://developers.cloudflare.com/hyperdrive/

你并不一定非要使用它,但它解决了从Workers使用SQL数据库的许多问题。此外,文档还会告诉你哪些数据库库适用于此场景。特别是,Supabase在 Hyperdrive上得到很好的支持:

https://developers.cloudflare.com/hyperdrive/examples/connect-to-postgres/postgres-database-providers/supabase/

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章