Skip to content

Diagnose Fetch-Failures

Standard-Async-Callbacks liefern dir nur die Daten zurück:

QuestData.get_game_data("weapons", func(rows: Array):
use(rows) # rows == [] heißt: was genau? Cache-Miss? 404? Auth?
)

Ein leeres Array kann vier verschiedene Sachen heißen:

  • Tabelle existiert leer im Backend
  • Backend-Tabelle existiert nicht (typo in table_name)
  • Auth verweigert (API-Key falsch oder gerevoked)
  • Backend nicht erreichbar (offline, DNS-Fail, 5xx)

Mit der 3-Argument-Variante des Callbacks (seit SDK v1.16.0) bekommst du success + error_code:

QuestData.get_game_data("weapons", func(rows: Array, success: bool, err: String):
if not success:
match err:
QDErrors.ERR_AUTH_FAILED:
push_error("API-Key invalid — check ProjectSettings")
QDErrors.ERR_BACKEND_UNREACHABLE:
push_warning("Offline — using last known cache")
QDErrors.ERR_TABLE_NOT_FOUND:
push_error("Table 'weapons' missing in backend — check dashboard")
QDErrors.ERR_TIMEOUT:
push_warning("Slow network — retry later")
_:
push_error("Fetch failed: " + err)
return
use(rows)
)
KonstanteBedeutungWann
QDErrors.ERR_OKSuccesssuccess=true immer mit ERR_OK
QDErrors.ERR_AUTH_FAILED401/403API-Key invalid, missing oder revoked
QDErrors.ERR_BACKEND_UNREACHABLENetwork/5xxDNS-Fail, Connect-refused, Server-Error
QDErrors.ERR_TABLE_NOT_FOUND404Tabelle existiert nicht im Backend
QDErrors.ERR_TIMEOUTTimeoutHTTPRequest-Timeout (10s default)
QDErrors.ERR_UNKNOWNCatchallSDK-not-init, empty table_name, malformed body

Alte 1-Arg-Callbacks bleiben unverändert funktional:

# Funktioniert weiterhin — kein Crash, kein Update nötig.
QuestData.get_game_data("weapons", func(rows: Array):
use(rows)
)

Das SDK detected die Callback-Signatur via Callable.get_argument_count() und ruft entweder mit 1 oder 3 Args auf.

Wenn die Tabelle im Cache liegt und das Backend gerade down ist, bekommst du trotzdem success=true, err=ERR_OK zurück — Customer hat ja Daten in der Hand. Force-Refresh (get_game_data(table, cb, true)) bricht die Cache-Path-Optimierung und löst einen frischen Fetch aus, dann erst siehst du echte Backend-Errors.

fetch_remote_config() emittiert _remote_config.config_fetched(success, error_code). Die Signal-Signatur wurde additive von 1-arg auf 2-arg erweitert — alte Listener kriegen den 2. Arg silently ignored:

# Direkt am Modul connecten (2-arg Style):
QuestData._remote_config.config_fetched.connect(func(success: bool, err: String):
if success:
_apply_my_remote_config()
elif err == QDErrors.ERR_AUTH_FAILED:
push_error("Cannot fetch config — API-Key invalid")
)
QuestData.fetch_remote_config()

get_config(key, default) bleibt synchron und returnt den Default sowohl bei “Backend down” als auch “Key existiert nicht” — verlasse dich auf das config_fetched-Signal, um die beiden Zustände zu unterscheiden.

Wenn ein Customer-Report sagt “meine Werte werden nicht aus dem Dashboard übernommen”, schick ihm dieses Snippet:

QuestData.get_game_data("weapons", func(_rows, success, err):
print("[DEBUG] weapons fetch — success=%s err=%s" % [success, err])
, true) # force_refresh=true bricht Cache, zwingt echten Backend-Call

Der err-Code im Console-Output sagt dir sofort, ob es Auth, Network oder Schema ist.