Błędy, przekroczenia limitu czasu i ponowne próby
Jak odczytać, co zwraca invoke, gdy coś pójdzie nie tak i kiedy możesz bezpiecznie zadzwonić ponownie.
1. Obiekt błędu
invoke zwraca { data, error } i nigdy nie rzuca. error to AuraError, więc isAuraError(error) jest prawdą. Dwie podklasy informują , kto zawiódł:
| Pole | Oznaczający |
|---|---|
error.status | Stan HTTP. 0 oznacza, że na kliencie wystąpiła awaria (brak odpowiedzi). |
error.code | Stabilny identyfikator, na przykład NOT_FOUND, QUOTA_EXCEEDED, timeout, invalid_body. |
error.message | Tekst zwrócony przez funkcję lub wyjaśnienie platformy. |
error.context | Na FunctionsHttpError: treść zwrócona przez funkcję (przeanalizowana JSON lub tekst). |
error.details | Surowa treść błędu. W przypadku błędu platformy zawiera error.request_id. |
2. Który to błąd?
Zachowania zaobserwowane w przypadku działającego stosu. Wiersz przydziału jest zgodny z mapowaniem błędów zaplecza i nie został wywołany w naszych testach.
| Co się stało | Klasa | status | code | message |
|---|---|---|---|---|
| Funkcja nie istnieje | FunctionsHttpError | 404 | NOT_FOUND | „…Funkcja „nie” niemożliwa do rozwiązania” |
Twoja funkcja zwraca 500 z tekstem | FunctionsHttpError | 500 | http_500 | ten tekst |
Twoja funkcja zwraca samą wartość 503 | FunctionsHttpError | 503 | http_503 | co zwróciłeś |
| Twoja funkcja rzuca | FunctionsHttpError | 500 | http_500 | „Wewnętrzny błąd serwera” |
Twoja funkcja przekracza swój timeout_secs | FunctionsHttpError | 500 lub 503 | http_500 / http_503 | „Wykonanie funkcji nie powiodło się” lub „Funkcja zwróciła HTTP 503” |
| Środowisko wykonawcze jest nieosiągalne | FunctionsRelayError | 503 | SERVICE_UNAVAILABLE | wyjaśnia, że funkcja ta została uruchomiona , a nie |
| Sieć ulega awarii przed jakąkolwiek odpowiedzią | FunctionsRelayError | 0 | network_error | błąd sieci |
| Limit planu wyczerpany | FunctionsHttpError | 403 | QUOTA_EXCEEDED | komunikat dotyczący limitu |
| Zbyt wiele połączeń od jednego klienta | FunctionsHttpError | 429 | rate_limit_exceeded | czekaj na wiadomość |
| Żądanie jest zbyt duże | FunctionsRelayError | 503 | SERVICE_UNAVAILABLE | „przekroczono maksymalny rozmiar ładunku” |
Anulowałeś subskrypcję lub Twój timeout wygasł | AuraError | 0 | timeout | „Wywołanie funkcji zostało przerwane lub upłynął limit czasu” |
| Treści nie można wysłać w formacie JSON | AuraError | 0 | invalid_body | nazywa typ, którego należy unikać |
Jeśli Twój własny kod zwróci 502, 503 lub 504, otrzymasz FunctionsHttpError: klasa poinformuje Cię, kto odpowiedział, a nie jaki jest numer statusu.
Treść żądania powyżej około 256 KiB jest odrzucana z 503 SERVICE_UNAVAILABLE, a odpowiedź o wielkości około 300 KB lub więcej nie została zwrócona w ciągu naszego 50-sekundowego testu. Zobacz limity. Ponowna próba nie pomaga; wysyłaj mniej danych lub korzystaj z pamięci masowej.
3. Zdecyduj, czy spróbować ponownie
SDK nigdy nie ponawia próby wywołania: Twoja funkcja może mieć skutki uboczne, a powtarzające się POST domyślnie nie jest bezpieczne. Ty decydujesz, korzystając z poniższej tabeli.
| Awaria | Czy funkcja została uruchomiona? | Można bezpiecznie spróbować ponownie? |
|---|---|---|
503 z platformy (FunctionsRelayError) | Nie, środowisko wykonawcze było nieosiągalne | Tak, z krótką przerwą |
429 | NIE | Tak, po opóźnieniu w error.retryAfter |
403 QUOTA_EXCEEDED | NIE | Nie, dopóki limit nie zostanie zresetowany lub nie zmienisz planu |
status 0 (network_error) | Nieznany | Tylko jeśli twoja funkcja jest idempotentna |
timeout na kliencie | Nieznany | Tylko jeśli twoja funkcja jest idempotentna |
FunctionsHttpError 5xx | Tak, częściowo lub całkowicie | Tylko jeśli twoja funkcja jest idempotentna |
FunctionsHttpError 4xx | Tak | Nie: popraw żądanie |
Platforma nie deduplikuje wywołań i ignoruje Idempotency-Key. W przypadku płatności lub poczty e-mail przechowuj przekazany klucz w body i sprawdź go przy starcie funkcji.
4. Limity czasu
Trzy zegary działają jednocześnie:
| Zegar | Domyślny | Gdzie to zmienić |
|---|---|---|
| Twój klient | 30 s na każde responseType | invoke(…, { timeout }), { signal } lub requestTimeoutMs w opcjach klienta |
| Funkcja | 30 s, od 1 do 300 | permissions.timeout_secs w funkcji |
| Brama | 380 s | nie można konfigurować za pomocą projektów |
Gdy funkcja przekracza timeout_secs, środowisko wykonawcze ją anuluje, a wywołanie kończy się niepowodzeniem po mniej więcej tym opóźnieniu, z wartością 500 lub 503 pokazaną powyżej. Przyczyna pojawia się w error.context.detail (WorkerRequestCancelled: request has been cancelled by supervisor) w trybie surowym. Ustaw swojego klienta timeout nieco powyżej timeout_secs funkcji, aby zobaczyć ten błąd zamiast klienta timeout.
W przypadku pracy dłuższej niż kilka sekund wstaw zadanie do kolejki zamiast utrzymywać otwarte połączenie.
5. Znajdź przyczynę
- Błędy platformy mają identyfikator żądania:
error.details.error.request_id. Podaj go, kontaktując się z pomocą techniczną. aura functions logs <name>wyświetla listę ostatnich żądań HTTP z metodą, ścieżką, statusem, czasem trwania i identyfikatorem żądania. To , a nie pokazuje, co napisała twoja funkcja za pomocąconsole.loglubconsole.error: dane wyjściowe pozostają we własnych dziennikach środowiska wykonawczego, które może odczytać tylko operator platformy. Zobacz limity dla tej i innych przerw bieżących.- Identyfikator wywołania nie jest przekazywany do Twojej funkcji. Podaj swój własny identyfikator w
headersi zaloguj go.