FiveM SCRIPT ERROR lesen und die Resource reparieren
SCRIPT ERROR: attempt to index a nil value und andere FiveM-Konsolenfehler erklärt: welche Datei und Zeile du öffnest, die Ursachen und die Fixes.
Von Termi
- Errors
- Lua
- Debugging
- Server health
Auf dieser Seite
- So liest du einen SCRIPT ERROR
- Häufige Fehler und ihre Fixes
- attempt to index a nil value
- attempt to call a nil value
- No such export in resource
- attempt to perform arithmetic on a nil value
- attempt to compare number with nil
- Fehler aus JavaScript-Resources
- Error running system event handling function
- Welche Fehler du zuerst behebst
- Lass FiveDock sie gruppieren
- Häufige Fragen
- Was bedeutet attempt to index a nil value in FiveM?
- Wie finde ich heraus, welche Resource einen SCRIPT ERROR verursacht?
- Warum erscheinen SCRIPT ERRORs nach dem Update einer Resource?
- Kann ich SCRIPT ERRORs aus der Konsole ausblenden?
Die Konsole jedes FiveM-Servers gibt rote SCRIPT ERROR-Zeilen aus, und ein gut besuchter Server schafft Hunderte pro Tag. Die meisten stammen von wenigen Fehlern, die sich über viele Resources wiederholen. Diese Anleitung zeigt, wie du einen liest, was die häufigsten Meldungen bedeuten und wie du die wenigen findest, die du zuerst beheben solltest.
So liest du einen SCRIPT ERROR
[ script:qb-garages] SCRIPT ERROR: @qb-garages/server/main.lua:57: attempt to index a nil value (local 'Player')
[ script:qb-garages] > handler (@qb-garages/server/main.lua:57)Häufige Fehler und ihre Fixes
attempt to index a nil value
Das Script liest ein Feld von etwas, das nicht existiert. Bei ESX und QBCore ist es fast immer das Player-Objekt, abgerufen für einen Spieler, der schon gegangen ist oder noch nicht fertig geladen hat:
local Player = QBCore.Functions.GetPlayer(source)
if not Player then return end
local cash = Player.PlayerData.money.cashDie Prüfung in der zweiten Zeile ist der Fix, und dasselbe gilt für ESX.GetPlayerFromId(source). Nennt die Meldung ein Feld, wie in (field 'PlayerData'), existiert die Tabelle darüber, hat aber diesen Schlüssel nicht. Das heißt oft, dass das Script für eine andere Version des Frameworks geschrieben wurde.
attempt to call a nil value
Das Script ruft eine Funktion auf, die es nicht gibt, und die Klammer nennt sie: (field 'GetPlayerData') oder (method 'addMoney'). Meist liegt es an einer Funktion, die das Framework in einem Update umbenannt hat, an einer Resource, die sie definiert, aber später startet, oder an einer globalen Variable wie ESX, die nie gesetzt wurde. Neueres ESX gibt sein Objekt über exports['es_extended']:getSharedObject() oder @es_extended/imports.lua heraus, und ein Script, das noch auf das alte Event esx:getSharedObject wartet, kann ohne es dastehen.
No such export in resource
No such export SendAlert in resource ps-mdt heißt, dass ein Script exports['ps-mdt']:SendAlert() aufgerufen hat und ps-mdt keinen Export mit diesem Namen hat, zumindest noch nicht. Entweder ist die Resource nicht gestartet, sie läuft unter einem anderen Ordnernamen oder der Export wurde umbenannt. Setze die Resource, die den Export liefert, in der server.cfg weiter nach oben und prüfe den Namen in ihrer fxmanifest.lua oder Dokumentation.
attempt to perform arithmetic on a nil value
So etwas wie count + 1, wobei count nil ist, meist ein Wert aus der Datenbank oder ein Config-Schlüssel, den es nicht gibt. Gib ihm dort, wo er gelesen wird, einen Standardwert: local count = row.count or 0.
attempt to compare number with nil
Dieselbe Ursache in einem Vergleich: if amount > Config.Limit, obwohl Limit in deiner Config fehlt. Prüfe, ob jeder Schlüssel, den das Script liest, in deiner Kopie der config.lua existiert, besonders nach einem Update, das neue hinzugefügt hat.
Fehler aus JavaScript-Resources
JavaScript-Resources geben SCRIPT ERROR: aus, gefolgt von einem JavaScript-Fehler und einem at-Stack. TypeError: Cannot read properties of undefined (reading 'citizenid') ist die JavaScript-Variante des Zugriffs auf nil und braucht dieselbe Prüfung.
Error running system event handling function
Diese Zeile bedeutet, dass ein Handler für ein eingebautes Event wie playerDropped oder onResourceStart einen Fehler geworfen hat. Die Zeilen darunter nennen Datei und Zeile, genau wie bei einem normalen SCRIPT ERROR.
Welche Fehler du zuerst behebst
Eine Konsole mit fünfhundert Fehlern enthält meist zwanzig verschiedene. Behebe sie nach Wirkung: zuerst den Fehler, der die meisten Spieler getroffen hat, dann alles, was seit dem letzten Neustart neu ist, meist das Update, das du gerade ausgespielt hast. Wenn die Konsole in einer Datei gespeichert wird, zählt das hier die Fehler nach Stelle:
grep -o 'SCRIPT ERROR: @[^:]*:[0-9]*' console.log | sort | uniq -c | sort -rn | head -20Es zählt nur Zeilen. Ein einzelner Spieler in einer Schleife kann einen harmlosen Fehler nach oben schieben, und ein lauter Fehler von gestern sieht genauso aus wie einer, der vor einer Stunde angefangen hat.
Lass FiveDock sie gruppieren
Der FiveDock-Agent liest die Server-Konsole, sobald sie etwas ausgibt. Er verbindet jeden SCRIPT ERROR mit seinem Stack, maskiert Spielernamen, IP-Adressen und Identifier und gruppiert Fehler nach Resource, Datei, Zeile und Meldung, wobei Zahlen in der Meldung ignoriert werden, damit derselbe Bug nur einmal zählt.
Auf Metro listet Error Hunter diese Gruppen mit Anzahl, Zahl der betroffenen Spieler und dem Zeitpunkt, an dem jeder Fehler zuerst und zuletzt auftrat, mit allem Neuen seit dem Neustart oben. Deploy Guard macht vor einem Neustart ein Backup, gibt zehn Minuten danach ein Urteil ab und nennt die Resource hinter neuen Problemen.
Der Agent ist eine einzelne Resource ohne offene Ports. Starte ihn vor deinem Framework, damit er Fehler ab der ersten Sekunde eines Starts sieht.
Häufige Fragen
Was bedeutet attempt to index a nil value in FiveM?
Das Script hat versucht, ein Feld aus einer Variable zu lesen, die nil ist, und der Name in Klammern verrät, welche. Bei ESX und QBCore ist es meist ein Player-Objekt für einen Spieler, der die Verbindung getrennt hat oder noch nicht geladen ist, und der Fix ist, vor der Nutzung zu prüfen, ob das Objekt existiert.
Wie finde ich heraus, welche Resource einen SCRIPT ERROR verursacht?
Die Resource ist der Name nach @ am Anfang der Fundstelle, wie in @qb-garages/server/main.lua:57. Ist das ein Framework oder eine Bibliothek, lies die Stack-Zeilen, die mit > beginnen, bis zur ersten in einer Resource, die du selbst betreibst.
Warum erscheinen SCRIPT ERRORs nach dem Update einer Resource?
Updates benennen Funktionen und Exports um, fügen Config-Schlüssel hinzu und erwarten neuere Versionen des Frameworks. Vergleiche die neue config.lua mit deiner, suche im Changelog nach umbenannten Exports und starte Resources neu, die von der aktualisierten abhängen.
Kann ich SCRIPT ERRORs aus der Konsole ausblenden?
Du kannst Aufrufe in pcall packen, aber das versteckt den Bug und lässt liegen, was er kaputt gemacht hat. Behebe den nil-Wert dort, wo er herkommt, und gruppiere die Fehler, um zu sehen, welche zählen.