intento de indexar un valor nil
Un script esperaba que cierta información estuviera lista y no estaba, así que se detuvo.
Haz esto primero
Anota qué script y qué archivo nombra el mensaje, y comprueba si arrancó antes que tu framework.
Qué significa
Algo usó el operador . o [] sobre una variable que es nil. En Lua, a.b sólo es legal cuando a es una tabla; cuando a es nil el script se detiene en esa línea. El mensaje suele nombrar qué era nil: (field 'PlayerData'), (global 'ESX'), (local 'data'), (upvalue 'Config').
Ese nombre entre paréntesis es la parte más útil del mensaje, y cada clase apunta a un sitio distinto:
• global 'X' — nunca se asignó, o se asignó en un archivo que no se ejecutó.
• field 'X' — la tabla existe pero no tiene esa clave.
• local 'X' / upvalue 'X' — se asigna en este archivo, pero no antes de que corriera esta línea.
Qué lo provoca
Ordenado por la frecuencia con la que es la respuesta.
- 1
El objeto del framework todavía no cargó (lo más común en el cliente)
Un archivo de cliente lee
ESX,QBCoreoPlayerDataa nivel de archivo o en un hilo temprano, antes de que el framework haya entregado el objeto del jugador. Tu recurso arranca antes de que el framework termine de cargar al jugador. - 2
Una clave de configuración que no existe
Config.Something.valuedondeConfig.Somethingnunca se definió, se renombró, o vive en un archivo que no está listado en el fxmanifest. - 3
El servidor mandó nil
Un manejador de evento de cliente indexa una tabla que pasó el servidor, y por algún camino el servidor no pasó nada.
TriggerClientEvent('x', src)sin carga le da nil al manejador. - 4
Un envoltorio que no devolvió nada
Los nativos no devuelven tablas, pero un ayudante alrededor de uno sí puede devolver nil para una entidad inválida, y quien lo llama indexa eso.
- 5
El orden de carga
El archivo que define la tabla está listado DESPUÉS del archivo que la usa en el fxmanifest, así que en el momento de usarla todavía no existe.
Cómo saber cuál es el tuyo
Imprimí el contenedor, no el campo, justo encima de la línea que falla:
print(json.encode(Config.Something))
Si imprime null, el problema es el contenedor y el campo es una pista falsa. Si el nombre entre paréntesis es un global del framework, añadí una espera y mirá si el error se mueve: un problema de tiempos desaparece, una clave que falta no.
Dónde mirar
Abrí el archivo y la línea de la pila. Leé la sentencia entera, no sólo lo que está antes del punto: en a.b.c.d cualquiera de a, a.b o a.b.c puede ser el nil, y el nombre entre paréntesis te dice cuál.
Cómo arreglarlo
Para los tiempos del framework, no leas nunca el objeto a nivel de archivo:
local PlayerData = {}
RegisterNetEvent('esx:playerLoaded', function(xPlayer)
PlayerData = xPlayer
end)
-- cuando de verdad lo necesitás durante el arranque:
CreateThread(function()
while not ESX or not ESX.IsPlayerLoaded() do Wait(100) end
-- de acá para abajo es seguro
end)Para todo lo demás, protegete antes de indexar:
local entry = Config.Jobs[job] if not entry then return end
¿Sigues atascado en tu propio código?
Esta página es lo que suele significar este error. Pega tu consola en Server Fixer y ordenará todo lo que haya en ella y te dirá qué hacer primero; y si prefieres no tocarlo, ORBIE puede reparar el script y devolverte el recurso listo para soltar.
bug_reportAbrir el Server FixerPara este tipo de error, el Script Optimizer lee el script y repara el código que hay detrás.
Errores que viajan con este
- intento de llamar a un valor nil
- PlayerData está vacío o todavía no cargó
- El objeto del framework es nil (ESX / QBCore)
- no se puede reanudar una corrutina muerta
- SCRIPT ERROR en citizen:/scripting/lua/scheduler.lua
- intento de indexar un número, booleano o texto
- intento de ceder a través de un límite de llamada en C
- desbordamiento de pila
- el índice de la tabla es nil