Ошибки, тайм-ауты и повторные попытки
Как прочитать, что invoke возвращает, когда что-то пойдет не так, и когда вы сможете безопасно позвонить еще раз.
1. Объект ошибки
invoke возвращает { data, error } и никогда не выдает исключение. error — это AuraError, поэтому isAuraError(error) истинно. Два подкласса сообщают , кто провалил:
| Поле | Значение |
|---|---|
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 | объясняет, что функция была , а не. |
| Сеть выходит из строя до какого-либо ответа | 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 | называет тип, которого следует избегать |
Если ваш собственный код возвращает 502, 503 или 504, вы получаете FunctionsHttpError: класс сообщает вам, кто ответил, а не какой номер статуса.
3. Решите, стоит ли повторять попытку
SDK никогда не повторяет вызов за вас: ваша функция может иметь побочные эффекты, а повторный вызов POST по умолчанию небезопасен. Решать вам, используя таблицу ниже.
| Отказ | Функция запустилась? | Безопасно ли повторить попытку? |
|---|---|---|
503 с платформы (FunctionsRelayError) | Нет, время выполнения было недоступно | Да, с коротким перерывом |
429 | Нет | Да, после задержки в error.retryAfter |
403 QUOTA_EXCEEDED | Нет | Нет, пока квота не будет сброшена или вы не смените план. |
status 0 (network_error) | Неизвестный | Только если ваша функция идемпотентна |
timeout на клиенте | Неизвестный | Только если ваша функция идемпотентна |
FunctionsHttpError 5xx | Да, частично или полностью | Только если ваша функция идемпотентна |
FunctionsHttpError 4xx | Да | Нет: исправить запрос |
Платформа не выполняет дедупликацию вызовов и игнорирует Idempotency-Key. Для платежей или электронной почты сохраните переданный вами ключ в body и проверьте его в начале функции.
4. Тайм-ауты
Три часа идут одновременно:
| Часы | По умолчанию | Где это изменить |
|---|---|---|
| Ваш клиент | 30 секунд на каждый responseType | 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. Найдите причину
- Ошибки платформы содержат идентификатор запроса:
error.details.error.request_id. Укажите его при обращении в службу поддержки. aura functions logs <name>перечисляет последние HTTP-запросы с указанием метода, пути, статуса, продолжительности и идентификатора запроса. , а не, показывает то, что ваша функция написала с помощьюconsole.logилиconsole.error: этот вывод остается в собственных журналах среды выполнения, которые может прочитать только оператор платформы. См. ограничения для этого и других текущих разрывов.- Идентификатор вызова не пересылается в вашу функцию. Передайте свой идентификатор в
headersи зарегистрируйте его.