Skip to content

Troubleshooting 'CONNECT_TIMEOUT' or hanging queries in Serverless Functions

Last edited: 8/12/2026

在无服务器函数中使用持久化客户端(如 postgres-js)时,可能会出现间歇性的 CONNECT_TIMEOUT 错误或查询挂起直到达到执行限制的情况。

🌐 Intermittent CONNECT_TIMEOUT errors or queries that hang until reaching the execution limit may occur when using persistent clients, such as postgres-js, within Serverless Functions.

为什么会这样? 无服务器环境可能会在请求之间冻结函数。这会导致 TCP 套接字变得过时,因为连接池或 NAT 可能会在客户端 keepalive 定时器暂停时丢弃不活动的连接。函数恢复运行后,客户端尝试重用已经失效的套接字,从而导致挂起。

如何解决这个问题:

  • 使用数据 API: 将以读取为主的工作负载迁移到 Supabase 数据 API(PostgREST)。这使用无状态的 HTTP 请求,避免了持久 TCP 套接字的问题。
  • 活跃性预检: 对于使用 postgres-js 的事务路径,在执行主查询前,通过让 SELECT 1 查询与一个短超时(例如几秒)竞争来实现预检。如果预检超时,就重启数据库客户端。
  • 迁移到 Vercel Fluid Compute: 使用 Vercel 的 Fluid Compute 和 attachDatabasePool。这个环境支持 waitUntil 钩子,它可以让运行时在实例暂停前正确关闭空闲连接。
  • 应用重试: 针对连接超时错误实现应用层的重试逻辑,以强制进行新的连接尝试。