[ PROMPT_NODE_24476 ]
常见问题与排查
[ SKILL_DOCUMENTATION ]
# 常见问题与排查
Cloudflare Workers 中 TCP 套接字的常见陷阱、限制及解决方案。
## 平台限制
### 连接限制
| 限制 | 值 |
|-------|-------|
| 每个请求的最大并发套接字数 | 6 (硬限制) |
| 套接字生命周期 | 请求持续时间 |
| 连接超时 | 取决于平台,无设置项 |
**问题:** 超过 6 个连接会抛出错误
**解决方案:** 以 6 个为一批进行处理
typescript
for (let i = 0; i connect({ hostname: h, port: 443 }));
await Promise.all(batch.map(async s => { /* 使用 */ await s.close(); }));
}
### 被阻止的目标
出于安全考虑,Cloudflare IP (1.1.1.1)、本地回环地址 (127.0.0.1)、端口 25 (SMTP) 以及 Worker 自身的 URL 均被阻止。
**解决方案:** 使用公网 IP 或 Tunnel 主机名:`connect({ hostname: "db.internal.company.net", port: 5432 })`
### 作用域要求
**问题:** 在全局作用域创建的套接字会失败
**原因:** 套接字绑定在请求生命周期内
**解决方案:** 在处理程序内创建:`export default { async fetch() { const socket = connect(...); } }`
## 常见错误
### 错误:"proxy request failed"
**原因:** 目标被阻止(Cloudflare IP、本地回环、端口 25)、DNS 失败、网络不可达
**解决方案:** 验证目标,使用 Tunnel 主机名,使用 try/catch 捕获错误
### 错误:"TCP Loop detected"
**原因:** Worker 连接到自身
**解决方案:** 连接到外部服务,而不是 Worker 自己的主机名
### 错误:"Port 25 prohibited"
**原因:** SMTP 端口被阻止
**解决方案:** 使用 Email Workers API 发送邮件
### 错误:"socket is not open"
**原因:** 关闭后进行读/写操作
**解决方案:** 始终使用 try/finally 确保正确的关闭顺序
### 错误:连接超时
**原因:** 无内置超时机制
**解决方案:** 使用 `Promise.race()`:
typescript
const socket = connect(addr, opts);
const timeout = new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), 5000));
await Promise.race([socket.opened, timeout]);
## TLS/SSL 问题
### StartTLS 时机
**问题:** 过早调用 `startTls()`
**解决方案:** 发送协议特定的 STARTTLS 命令,等待服务器 OK 响应,然后再调用 `socket.startTls()`
### 证书验证
**问题:** 自签名证书验证失败
**解决方案:** 使用合规证书或 Tunnel(它会处理 TLS 终止)
## 性能问题
### 未使用连接池
**问题:** 每个请求都有新的连接开销
**解决方案:**