错误、超时和重试
当出现问题时以及何时可以安全地再次调用时,如何读取 invoke 返回的内容。
9分钟 读取·级别 中间·修改于 2026年10月12日
该英文文本是根据法文原文自动生成的,尚未经过审查。
该页面已自动翻译。英文版具有权威性。
#
解剖学
1. 错误对象
invoke 返回 { data, error } 并且从不抛出异常。 error 是 AuraError,因此 isAuraError(error) 为 true。两个子类告诉您 谁失败了:
| 领域 | 含义 |
|---|---|
error.status | HTTP 状态。 0 表示客户端发生故障(无响应)。 |
error.code | 稳定标识符,例如 NOT_FOUND、 QUOTA_EXCEEDED、 timeout、 invalid_body。 |
error.message | 您的函数返回的文本,或平台的解释。 |
error.context | 在 FunctionsHttpError上:函数返回的主体(解析的 JSON 或文本)。 |
error.details | 原始错误主体。对于平台错误,它包含 error.request_id。 |
#
诊断
2. 哪个错误?
针对正在运行的堆栈观察到的行为。配额行遵循后端的错误映射,在我们的测试中未触发。
| 发生了什么 | 班级 | status | code | message |
|---|---|---|---|---|
| 该函数不存在 | FunctionsHttpError | 404 | NOT_FOUND | “……功能‘不’麻烦” |
您的函数返回带有文本的 500 | FunctionsHttpError | 500 | http_500 | 该文本 |
您的函数返回 503 本身 | FunctionsHttpError | 503 | http_503 | 你返回了什么 |
| 你的函数抛出 | FunctionsHttpError | 500 | http_500 | “内部服务器错误” |
您的函数超出了其 timeout_secs | FunctionsHttpError | 500或503 | http_500 / http_503 | “函数执行失败”或“函数返回 HTTP 503” |
| 运行时无法访问 | FunctionsRelayError | 503 | SERVICE_UNAVAILABLE | 解释该函数是 而不是 run |
| 在任何响应之前网络发生故障 | FunctionsRelayError | 0 | network_error | 网络错误 |
| 计划配额已用完 | FunctionsHttpError | 403 | QUOTA_EXCEEDED | 配额消息 |
| 一位客户的来电过多 | FunctionsHttpError | 429 | rate_limit_exceeded | 等待消息 |
| 请求正文太大 | FunctionsRelayError | 503 | SERVICE_UNAVAILABLE | “超出最大有效负载大小” |
您取消了,或者您的 timeout 已过期 | AuraError | 0 | timeout | “函数调用中止或超时” |
| 正文无法以 JSON 形式发送 | AuraError | 0 | invalid_body | 命名要避免的类型 |
您的函数中的 503 不是平台故障
如果您自己的代码返回 502、 503 或 504,您会得到 FunctionsHttpError:类告诉您谁回答了,而不是状态号是什么。
两次失败看起来有些不同
超过约 256 KiB 的请求正文会被 503 SERVICE_UNAVAILABLE拒绝,并且约 300 KB 或更多的 响应 在我们的 50 秒测试内没有返回。请参阅 限制。重试并没有帮助;发送较少的数据,或使用存储。
#
重试
3. 决定是否重试
SDK 永远不会为您重试调用:您的函数可能会产生副作用,并且默认情况下重复的 POST 并不安全。您可以使用下表来决定。
| 失败 | 函数运行了吗? | 可以安全重试吗? |
|---|---|---|
来自平台的 503 (FunctionsRelayError) | 不,运行时无法访问 | 是的,有短暂的后退 |
429 | 否 | 是的,在 error.retryAfter 延迟之后 |
403 QUOTA_EXCEEDED | 否 | 否,直到配额重置或您更改计划 |
status 0 (network_error) | 未知 | 仅当您的函数是幂等的 |
客户端上的 timeout | 未知 | 仅当您的函数是幂等的 |
FunctionsHttpError 5xx | 是的,部分或全部 | 仅当您的函数是幂等的 |
FunctionsHttpError 4xx | 是的 | 否:修复请求 |
使函数具有幂等性
该平台不会重复调用并忽略 Idempotency-Key。对于付款或电子邮件,请将您传递的密钥存储在 body 中,并在函数开始时检查它。
#
时间
4. 超时
三个时钟同时运行:
| 时钟 | 默认 | 哪里可以改 |
|---|---|---|
| 你的客户 | 每个 responseType 30 秒 | 客户端选项中的 invoke(…, { timeout })、 { signal }或 requestTimeoutMs |
| 功能 | 30 秒,1 到 300 之间 | 函数上的 permissions.timeout_secs |
| 网关 | 380 s | 不可按项目配置 |
当函数超过 timeout_secs时,运行时会取消它,并且您的调用会在大约该延迟后失败,并显示如上所示的 500 或 503。原因出现在原始模式下的 error.context.detail (WorkerRequestCancelled: request has been cancelled by supervisor) 中。将客户端 timeout 设置为略高于函数的 timeout_secs 即可看到此错误,而不是客户端 timeout。
对于超过几秒的工作,将作业 排入队列,而不是保持连接打开。
#
调试
5.查找原因
- 平台错误携带请求 ID:
error.details.error.request_id。当您联系支持人员时引用它。 aura functions logs <name>列出最近的 HTTP 请求,包括方法、路径、状态、持续时间和请求 ID。它确实 而不是 显示函数用console.log或console.error写入的内容:该输出保留在运行时自己的日志中,只有平台操作员才能读取。请参阅 限制 了解这一点和其他当前差距。- 调用的标识符不会转发到您的函数。在
headers中传递您自己的 ID 并记录它。
最后更新· 2026年10月12日