Diagnose Fetch-Failures
Fetch-Failures game-side diagnostizieren
Section titled “Fetch-Failures game-side diagnostizieren”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))Error-Codes
Section titled “Error-Codes”| Konstante | Bedeutung | Wann |
|---|---|---|
QDErrors.ERR_OK | Success | success=true immer mit ERR_OK |
QDErrors.ERR_AUTH_FAILED | 401/403 | API-Key invalid, missing oder revoked |
QDErrors.ERR_BACKEND_UNREACHABLE | Network/5xx | DNS-Fail, Connect-refused, Server-Error |
QDErrors.ERR_TABLE_NOT_FOUND | 404 | Tabelle existiert nicht im Backend |
QDErrors.ERR_TIMEOUT | Timeout | HTTPRequest-Timeout (10s default) |
QDErrors.ERR_UNKNOWN | Catchall | SDK-not-init, empty table_name, malformed body |
Backwards-Compat
Section titled “Backwards-Compat”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.
Cache-Hits zählen als Success
Section titled “Cache-Hits zählen als Success”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.
Remote Config
Section titled “Remote Config”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.
Debug-Workflow
Section titled “Debug-Workflow”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-CallDer err-Code im Console-Output sagt dir sofort, ob es Auth, Network oder Schema ist.