Cloudflare Workers上 Better Auth与 Supabase的连接问题(pg pool、postgres.js、Kysely不稳定或被阻塞)
我正在尝试把 Better Auth 连接到一个 Supabase PostgreSQL数据库,后台运行在 Cloudflare Workers 上,但连接不稳定,偶尔还会被阻塞。
背景信息
- 运行时:Cloudflare Workers
- 数据库:Supabase(带事务池的PostgreSQL)
- 已测试的ORM / 客户端:
postgres.js,kysely - 认证库:Better Auth
问题
- 使用Supabase 事务池(pgBouncer) → 工作不稳定(失败率约50%)
- 使用
postgres.js或kysely→ 在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的数据库驱动
⸻
问题
- Cloudflare Workers是否能够通过TCP与 postgres.js / Kysely兼容,还是这是预期会失败?
- Supabase的 pgBouncer是否应该在无服务器边缘环境中可靠工作?
- 在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上得到很好的支持:
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。