光环标志
光环基地文档
文档›Edge Functions›Errors, timeouts and retries

错误、超时和重试

当出现问题时以及何时可以安全地再次调用时,如何读取 invoke 返回的内容。

9分钟 读取·级别 中间·修改于 2026年10月12日
该英文文本是根据法文原文自动生成的,尚未经过审查。
该页面已自动翻译。英文版具有权威性。
#
解剖学

1. 错误对象

invoke 返回 { data, error } 并且从不抛出异常。 error 是 AuraError,因此 isAuraError(error) 为 true。两个子类告诉您 谁失败了:

classify.tstypescript
import { FunctionsHttpError, FunctionsRelayError } from '@aurabase/aurabase-js'

const { data, error } = await aura.functions.invoke('checkout', { body })

if (error instanceof FunctionsHttpError) {
  // 您的函数已响应,但状态为错误。调试您的代码。
} else if (error instanceof FunctionsRelayError) {
  // 平台失败:你的函数的答案再也没有回来。
} else if (error) {
  // 客户端取消或拒绝调用(超时、invalid_body、no_session)。
}
领域含义
error.statusHTTP 状态。 0 表示客户端发生故障(无响应)。
error.code稳定标识符,例如 NOT_FOUND、 QUOTA_EXCEEDED、 timeout、 invalid_body。
error.message您的函数返回的文本,或平台的解释。
error.context在 FunctionsHttpError上:函数返回的主体(解析的 JSON 或文本)。
error.details原始错误主体。对于平台错误,它包含 error.request_id。
#
诊断

2. 哪个错误?

针对正在运行的堆栈观察到的行为。配额行遵循后端的错误映射,在我们的测试中未触发。

发生了什么班级statuscodemessage
该函数不存在FunctionsHttpError404NOT_FOUND“……功能‘不’麻烦”
您的函数返回带有文本的 500FunctionsHttpError500http_500该文本
您的函数返回 503 本身FunctionsHttpError503http_503你返回了什么
你的函数抛出FunctionsHttpError500http_500“内部服务器错误”
您的函数超出了其 timeout_secsFunctionsHttpError500或503http_500 / http_503“函数执行失败”或“函数返回 HTTP 503”
运行时无法访问FunctionsRelayError503SERVICE_UNAVAILABLE解释该函数是 而不是 run
在任何响应之前网络发生故障FunctionsRelayError0network_error网络错误
计划配额已用完FunctionsHttpError403QUOTA_EXCEEDED配额消息
一位客户的来电过多FunctionsHttpError429rate_limit_exceeded等待消息
请求正文太大FunctionsRelayError503SERVICE_UNAVAILABLE“超出最大有效负载大小”
您取消了,或者您的 timeout 已过期AuraError0timeout“函数调用中止或超时”
正文无法以 JSON 形式发送AuraError0invalid_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是的否:修复请求
retry.tstypescript
import { FunctionsRelayError } from '@aurabase/aurabase-js'

async function invokeWithRetry(name: string, body: unknown, attempts = 3) {
  for (let i = 0; i < attempts; i++) {
    const res = await aura.functions.invoke(name, { body })
    const safe = res.error instanceof FunctionsRelayError && res.error.status === 503
    if (!res.error || !safe) return res
    await new Promise((r) => setTimeout(r, 2 ** i * 500))
  }
  return aura.functions.invoke(name, { body })
}
使函数具有幂等性

该平台不会重复调用并忽略 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。

timeout.tstypescript
const { error } = await aura.functions.invoke('report', { timeout: 35_000 })
if (error?.code === 'timeout') {
  // 已被您的客户取消。该函数可能仍在运行。
}

对于超过几秒的工作,将作业 排入队列,而不是保持连接打开。

#
调试

5.查找原因

  • 平台错误携带请求 ID: error.details.error.request_id。当您联系支持人员时引用它。
  • aura functions logs <name> 列出最近的 HTTP 请求,包括方法、路径、状态、持续时间和请求 ID。它确实 而不是 显示函数用 console.log 或 console.error写入的内容:该输出保留在运行时自己的日志中,只有平台操作员才能读取。请参阅 限制 了解这一点和其他当前差距。
  • 调用的标识符不会转发到您的函数。在 headers 中传递您自己的 ID 并记录它。
最后更新· 2026年10月12日