THE ORB
Démarrage du studio

tentative d'indexer une valeur nil

Un script attendait qu'une information soit prête et elle ne l'était pas, alors il s'est arrêté.

groupsCette fonctionnalité cesse de marchercodeIl faut un développeur

Faites d'abord ceci

Notez le script et le fichier nommés par le message, et vérifiez s'il a démarré avant votre framework.

bug_reportCollez plutôt toute votre console

Ce que ça veut dire

Quelque chose a utilisé l'opérateur . ou [] sur une variable qui est nil. En Lua, a.b n'est légal que si a est une table ; quand a est nil, le script s'arrête sur cette ligne. Le message nomme en général ce qui était nil : (field 'PlayerData'), (global 'ESX'), (local 'data'), (upvalue 'Config').

Ce nom entre parenthèses est la partie la plus utile du message, et chaque type pointe ailleurs :

global 'X' — jamais affecté, ou affecté dans un fichier qui n'a pas tourné.

field 'X' — la table existe mais n'a pas cette clé.

local 'X' / upvalue 'X' — affecté dans ce fichier, mais pas avant l'exécution de cette ligne.

Ce qui la provoque

Classé par fréquence : la cause la plus probable en premier.

  1. 1

    L'objet du framework n'a pas encore chargé (le plus courant côté client)

    Un fichier client lit ESX, QBCore ou PlayerData au niveau du fichier ou dans un thread précoce, avant que le framework n'ait remis l'objet joueur. Votre ressource démarre avant que le framework ait fini de charger le joueur.

  2. 2

    Une clé de config qui n'existe pas

    Config.Something.valueConfig.Something n'a jamais été défini, a été renommé, ou vit dans un fichier absent du fxmanifest.

  3. 3

    Le serveur a envoyé nil

    Un gestionnaire d'événement client indexe une table passée par le serveur, et sur un chemin le serveur n'a rien passé. TriggerClientEvent('x', src) sans charge utile donne nil au gestionnaire.

  4. 4

    Un enrobage qui n'a rien renvoyé

    Les natives ne renvoient pas de tables, mais un utilitaire autour de l'une d'elles peut renvoyer nil pour une entité invalide, et l'appelant indexe ça.

  5. 5

    L'ordre de chargement

    Le fichier qui définit la table est listé APRÈS celui qui l'utilise dans fxmanifest : au moment de l'usage, elle n'existe pas encore.

Comment savoir laquelle est la vôtre

Affichez le conteneur, pas le champ, juste au-dessus de la ligne fautive :

print(json.encode(Config.Something))

Si cela affiche null, le problème est le conteneur et le champ est une fausse piste. Si le nom entre parenthèses est un global du framework, ajoutez une attente et voyez si l'erreur bouge : un problème de timing disparaît, une clé manquante non.

Où regarder

Ouvrez le fichier et la ligne de la pile. Lisez toute l'instruction, pas seulement ce qui précède le point : dans a.b.c.d, n'importe lequel de a, a.b ou a.b.c peut être le nil, et le nom entre parenthèses vous dit lequel.

Comment la corriger

Pour le timing du framework, ne lisez jamais l'objet au niveau du fichier :

local PlayerData = {}

RegisterNetEvent('esx:playerLoaded', function(xPlayer)
    PlayerData = xPlayer
end)

-- quand vous en avez vraiment besoin au démarrage :
CreateThread(function()
    while not ESX or not ESX.IsPlayerLoaded() do Wait(100) end
    -- sûr à partir d'ici
end)

Pour tout le reste, protégez avant d'indexer :

local entry = Config.Jobs[job]
if not entry then return end

Toujours bloqué sur votre propre code ?

Cette page explique ce que cette erreur signifie en général. Collez votre console dans Server Fixer : il classera tout ce qui s'y trouve et vous dira quoi faire en premier ; et si vous préférez ne pas y toucher, ORBIE peut réparer le script et vous rendre la ressource prête à déposer.

bug_reportOuvrir le Server Fixer

Pour ce type d'erreur, le Script Optimizer lit le script et répare le code derrière tout ça.

Les erreurs qui voyagent avec celle-ci