Keine solche Export-Funktion X in Ressource Y: wie man es in FiveM behebt

Bekommst du 'Keine solche Export-Funktion X in Ressource Y' in FiveM? Die Ursachen: Ressource nicht gestartet, falscher Ordnername, Client- oder Server-Seite stimmt nicht überein, umbenannte Export-Funktion und Startreihenfolge.

Die Konsole zeigt dies, oft in einer Schleife:

text
SCRIPT ERROR: @my_script/server/main.lua:14: No such export GetItemCount in resource my_inventory

Dein Skript rief exports['my_inventory']:GetItemCount() auf. Zu diesem Zeitpunkt hatte my_inventory keine Export-Funktion mit diesem Namen. Die Nachricht benennt beide Teile, also ist die Behebung eine von einer kleinen Anzahl von Ursachen. Dieser Leitfaden behandelt den generischen Fall. Wenn die Export-Funktion getSharedObject von es_extended ist, lese stattdessen No such export getSharedObject in resource es_extended, die die ESX-spezifischen Ursachen hat.

1. Die Ressource ist nicht gestartet

Eine Export-Funktion existiert nur, während ihre Ressource läuft. Prüfe die Konsole beim Start:

  • Ist die Ressource in server.cfg mit ensure oder start aufgelistet?
  • Ist es ohne Fehler gestartet, oder hat es Couldn't start resource oder Failed to load script gedruckt?
  • Ist es in txAdmin gestoppt? Prüfe die Seite Ressourcen.

Eine Ressource, die nicht gestartet hat, beispielsweise wegen eines Lua-Syntaxfehlers oder einer fehlenden Abhängigkeit, hat keine Export-Funktionen. Behebe zuerst ihren eigenen Fehler. Siehe Couldn't start resource und could not find dependency. Ein Syntaxfehler ist insbesondere in Lua syntax error: unexpected symbol near behandelt.

2. Der Ressourcenname ist falsch

exports['my_inventory'] verwendet den Ordnernamen der Ressource, nicht den Titel des Skripts. Wenn der Ordner umbenannt wurde, schlägt jedes Skript fehl, das ihn beim alten Namen aufruft.

Typische Situationen:

  • Du hast my_inventory-master oder my_inventory-main umbenannt und weiterhin den alten Namen genannt.
  • Der Name verwendet an einer Stelle einen Bindestrich und an der anderen einen Unterstrich: my-inventory und my_inventory sind verschiedene Ressourcen.
  • Die Groß-/Kleinschreibung unterscheidet sich: Passe den Ordner genau an.
  • Die Ressource befindet sich in einem Ordner mit Klammern wie [qb]. Die Klammern sind nur eine Kategorie: Sie sind nicht Teil des Namens, also verwende my_inventory, nicht [qb]/my_inventory.

Einige Ressourcen ersetzen eine andere mit provide 'other_name' in ihrem fxmanifest, damit Skripte, die nach dem alten Namen fragen, immer noch funktionieren. Wenn du eine Ressource durch eine kompatible ersetzt hast und der alte Name schlägt fehl, prüfe, ob die neue den Namen bereitstellt, und dass du den alten Ordner entfernt hast, damit die beiden nicht kollidieren.

3. Die Export-Funktion ist auf der anderen Seite

Export-Funktionen sind pro Seite. Eine Export-Funktion, die in einem Client-Skript registriert wird, kann nur von einem anderen Client-Skript aufgerufen werden, und eine auf dem Server nur von einem Server-Skript.

lua
-- my_inventory/server/main.lua
exports('GetItemCount', function(source, item)
    return 0
end)
lua
-- my_script/client/main.lua
-- fails: GetItemCount exists on the server only
local count = exports['my_inventory']:GetItemCount('water')

Zum Prüfen schaue in die Dateien des Anbieters: Die Zeile exports(...) ist in client/ oder server/, oder in einer Datei unter shared_scripts aufgelistet, die auf beiden Seiten läuft. Wenn die Export-Funktion nur auf dem Server ist, rufe sie von einem Server-Skript auf und bekomme die Daten zum Client mit einem Event oder einem Callback, siehe server callbacks.

4. Die Export-Funktion wurde umbenannt oder entfernt

Ressourcen ändern sich zwischen Versionen. Eine Export-Funktion namens GetItemCount in einer älteren Version kann in einer neueren getItemCount oder Search sein, und Lua-Namen sind Groß-/Kleinschreibung-empfindlich. Wenn der Fehler nach einer Aktualisierung einer der Ressourcen erschien:

  1. Öffne die fxmanifest.lua des Anbieters, README oder Dokumentation und suche nach der aktuellen Export-Funktionsliste.
  2. Durchsuche den Ressourcenordner nach exports( und nach dem Namen, den du aufrufst.
  3. Aktualisiere deinen Aufruf, oder aktualisiere die andere Ressource auf die Version, für die das Skript geschrieben wurde.

Denke daran, dass das Gegenteil auch existiert: Ein Skript, das aktualisiert wurde, um eine neue Export-Funktion aufzurufen, während der Anbieter immer noch eine alte Version ohne diese läuft.

bash
grep -rn "exports(" resources/[mic]/my_inventory

Verwende unter Windows stattdessen die Suchbox deines Editors.

5. Startreihenfolge und Abhängigkeiten

Wenn die Ressource existiert und die Export-Funktion hat, aber der Aufruf erfolgt, bevor sie bereit ist, bekommst du den gleichen Fehler. Ressourcen starten in der Reihenfolge von server.cfg:

cfg
ensure oxmysql
ensure ox_lib
ensure my_inventory

ensure my_script

Platziere den Anbieter über dem Skript, das es verwendet. Für eine dauerhafte Behebung, gebe den Link in der fxmanifest.lua des Aufrufers an:

lua
dependency 'my_inventory'

Dann startet FiveM my_inventory zuerst und weigert sich, das Skript ohne ihn zu starten. Mehr zum Ordnen in server.cfg resource order.

Zwei verwandte Fallen:

  • Die Export-Funktion wird spät registriert. exports('Name', fn) läuft, wenn die Zeile erreicht wird. Wenn die Datei darüber fehlschlägt oder sie nach einer langen Wait registriert, schlagen Aufrufer fehl, die in der Zwischenzeit laufen. Registriere Export-Funktionen oben in der Datei.
  • Ein Aufruf zur Ladezeit. Ein Top-Level-Aufruf wie local count = exports['my_inventory']:GetItemCount('water') läuft, wenn deine Datei geladen wird. Verschiebe ihn in ein Event oder einen Thread, oder stelle sicher, dass die Abhängigkeit bereits läuft.

Du kannst auch eine optionale Integration mit pcall und mit einer Prüfung schützen, dass die Ressource läuft:

lua
if GetResourceState('my_inventory') == 'started' then
    local ok, count = pcall(function()
        return exports['my_inventory']:GetItemCount('water')
    end)
end

GetResourceState gibt 'started', 'stopped', 'missing' oder andere Zustände zurück, also kannst du auch protokollieren, welcher Fall es ist. Für einen tieferen Einblick, wie Export-Funktionen funktionieren, lese FiveM exports in Lua.

6. Eine Ressource neu gestartet, nicht die andere

Das Neustarten eines Anbieters, während der Server läuft, verbindet nicht immer die Skripte neu, die seine Objekte halten. Nach dem Neustarten oder Aktualisieren eines Anbieters, starte die Skripte neu, die ihn aufrufen, oder starte den Server neu.

Checkliste

Symptom Behebung
Ressource nicht in der Konsole beim Start Füge ensure my_inventory zu server.cfg hinzu
Couldn't start resource über dem Fehler Behebe zuerst den Fehler des Anbieters
Ordner umbenannt Verwende den genauen Ordnernamen in exports['name']
Export-Funktion von der falschen Seite aufgerufen Rufe es von der Seite auf, die es definiert, oder verwende ein Event/Callback
Fehler nach einer Aktualisierung Die Export-Funktion wurde umbenannt oder entfernt; prüfe die aktuelle Export-Funktionsliste des Anbieters
Fehler nur beim Start Platziere den Anbieter über dem Aufrufer; füge eine dependency-Zeile hinzu
Funktioniert immer noch nicht nach Neustart des Anbieters Starte die Skripte neu, die ihn aufrufen

Kurze Antworten

Was bedeutet 'Keine solche Export-Funktion X in Ressource Y'?

Ein Skript rief exports['Y']:X() auf und Ressource Y hatte zu diesem Zeitpunkt keine Export-Funktion namens X. Y läuft nicht, hat einen anderen Namen, definiert X auf der anderen Seite, oder hat diese Export-Funktion in dieser Version nicht.

Ist der Ressourcenname Groß-/Kleinschreibung-empfindlich?

Behandle es als Groß-/Kleinschreibung-empfindlich: Der Name in exports['name'] muss genau mit dem Ordnernamen übereinstimmen, einschließlich Bindestriche und Unterstriche. Dies ist am wichtigsten auf Linux-Servern.

Behebt die ensure-Reihenfolge diesen Fehler?

Oft ja. Ressourcen starten in der Reihenfolge von server.cfg, also platziere die Ressource, die die Export-Funktion bereitstellt, über der, die sie aufruft, oder füge eine dependency-Zeile zum fxmanifest hinzu.

Scripts ohne dieses Problem

Mic PhoneEin faltbares Handy, das sich zum Tablet aufklappt und bis aufs echte Handy des Spielers reicht.Script ansehen →CCTV Security CamerasPlatzierbare Kameras, ein Live-Tablet mit Multi-View und ausgedruckte Beweisfotos.Script ansehen →Item Creator V2Erstelle nutzbare Items mit Animationen, Props, Effekten und mehr — ganz ohne Code.Script ansehen →

Weiterlesen