Errores, tiempos de espera y reintentos
Cómo leer lo que devuelve invoke cuando algo sale mal y cuándo puedes volver a llamar de forma segura.
1. El objeto del error
invoke devuelve { data, error } y nunca arroja. error es un AuraError, por lo que isAuraError(error) es verdadero. Dos subclases te dicen quién falló:
| campo | Significado |
|---|---|
error.status | Estado HTTP. 0 significa que el error ocurrió en el cliente (sin respuesta). |
error.code | Identificador estable, por ejemplo NOT_FOUND, QUOTA_EXCEEDED, timeout, invalid_body. |
error.message | El texto que devolvió su función o la explicación de la plataforma. |
error.context | En un FunctionsHttpError: el cuerpo que devolvió su función (JSON o texto analizado). |
error.details | El cuerpo del error sin formato. Para un error de plataforma, contiene error.request_id. |
2. ¿Qué error es?
Comportamientos observados frente a una pila en ejecución. La fila de cuota sigue la asignación de errores del backend y no se activó en nuestras pruebas.
| que paso | clase | status | code | message |
|---|---|---|---|---|
| La función no existe | FunctionsHttpError | 404 | NOT_FOUND | "...Función 'no' introducible" |
Tu función devuelve 500 con texto | FunctionsHttpError | 500 | http_500 | ese texto |
Su función devuelve 503 | FunctionsHttpError | 503 | http_503 | lo que devolviste |
| Tu función arroja | FunctionsHttpError | 500 | http_500 | "Error interno del servidor" |
Tu función excede su timeout_secs | FunctionsHttpError | 500 o 503 | http_500 / http_503 | "Error en la ejecución de la función" o "La función devolvió HTTP 503" |
| El tiempo de ejecución es inalcanzable | FunctionsRelayError | 503 | SERVICE_UNAVAILABLE | explica que la función era no ejecutada |
| La red falla ante cualquier respuesta. | FunctionsRelayError | 0 | network_error | el error de red |
| Cuota del plan agotada | FunctionsHttpError | 403 | QUOTA_EXCEEDED | el mensaje de cuota |
| Demasiadas llamadas de un cliente | FunctionsHttpError | 429 | rate_limit_exceeded | espera mensaje |
| El cuerpo de la solicitud es demasiado grande | FunctionsRelayError | 503 | SERVICE_UNAVAILABLE | "Se superó el tamaño máximo de carga útil" |
Cancelaste o tu timeout transcurrió | AuraError | 0 | timeout | "La invocación de función se canceló o se agotó el tiempo de espera" |
| El cuerpo no se puede enviar como JSON | AuraError | 0 | invalid_body | nombra el tipo a evitar |
Si su propio código devuelve 502, 503 o 504, obtiene un FunctionsHttpError: la clase le dice quién respondió, no cuál es el número de estado.
3. Decide si volver a intentarlo
El SDK nunca vuelve a intentar una invocación por usted: su función puede tener efectos secundarios y un POST repetido no es seguro de forma predeterminada. Tú decides, utilizando la siguiente tabla.
| fracaso | ¿Se ejecutó la función? | ¿Es seguro volver a intentarlo? |
|---|---|---|
503 desde la plataforma (FunctionsRelayError) | No, el tiempo de ejecución era inalcanzable | Sí, con un breve retroceso. |
429 | No | Sí, después del retraso en error.retryAfter |
403 QUOTA_EXCEEDED | No | No, hasta que se restablezca la cuota o cambies de plan |
status 0 (network_error) | Desconocido | Sólo si tu función es idempotente |
timeout en el cliente | Desconocido | Sólo si tu función es idempotente |
FunctionsHttpError 5xx | Sí, parcial o totalmente | Sólo si tu función es idempotente |
FunctionsHttpError 4xx | si | No: arreglar la solicitud |
La plataforma no deduplica llamadas e ignora Idempotency-Key. Para pagos o correo electrónico, almacene una clave que pase en body y verifíquela al inicio de la función.
4. Tiempos de espera
Tres relojes funcionan a la vez:
| Reloj | Predeterminado | donde cambiarlo |
|---|---|---|
| tu cliente | 30 s por cada responseType | invoke(…, { timeout }), { signal } o requestTimeoutMs en las opciones del cliente |
| la funcion | 30 s, entre 1 y 300 | permissions.timeout_secs en la función |
| la puerta de entrada | 380 s | no configurable por proyectos |
Cuando la función excede timeout_secs, el tiempo de ejecución la cancela y su llamada falla después de ese retraso, con el 500 o 503 que se muestra arriba. La causa aparece en error.context.detail (WorkerRequestCancelled: request has been cancelled by supervisor) en modo sin formato. Configure su cliente timeout ligeramente por encima del timeout_secs de la función para ver este error en lugar de un cliente timeout.
Para trabajos de más de unos pocos segundos, ponga en cola un trabajo en lugar de mantener abierta una conexión.
5. Encuentra la causa
- Los errores de plataforma llevan una identificación de solicitud:
error.details.error.request_id. Cítelo cuando se comunique con el soporte. aura functions logs <name>enumera las solicitudes HTTP recientes con método, ruta, estado, duración e identificación de la solicitud. no muestra lo que su función escribió conconsole.logoconsole.error: esa salida permanece en los propios registros del tiempo de ejecución, que solo el operador de la plataforma puede leer. Consulte los límites de para conocer esta y otras brechas actuales.- El identificador de la llamada no se reenvía a su función. Pase su propia identificación en
headersy regístrela.