tentativa de indexar um valor nil
Um script esperava que certa informação estivesse pronta e não estava, então parou.
Faça isto primeiro
Anote qual script e qual arquivo a mensagem nomeia, e veja se ele subiu antes do seu framework.
O que significa
Alguma coisa usou o operador . ou [] sobre uma variável que é nil. Em Lua, a.b só é legal quando a é uma tabela; quando a é nil o script para naquela linha. A mensagem costuma nomear o que era nil: (field 'PlayerData'), (global 'ESX'), (local 'data'), (upvalue 'Config').
Esse nome entre parênteses é a parte mais útil da mensagem, e cada tipo aponta para um lugar diferente:
• global 'X' — nunca foi atribuído, ou foi atribuído num arquivo que não rodou.
• field 'X' — a tabela existe mas não tem essa chave.
• local 'X' / upvalue 'X' — é atribuído neste arquivo, mas não antes desta linha rodar.
O que causa isso
Ordenado pela frequência com que é a resposta.
- 1
O objeto do framework ainda não carregou (o mais comum no cliente)
Um arquivo de cliente lê
ESX,QBCoreouPlayerDataem nível de arquivo ou numa thread inicial, antes de o framework entregar o objeto do jogador. O seu resource sobe antes de o framework terminar de carregar o jogador. - 2
Uma chave de configuração que não existe
Config.Something.valueondeConfig.Somethingnunca foi definido, foi renomeado, ou vive num arquivo que não está listado no fxmanifest. - 3
O servidor mandou nil
Um handler de evento de cliente indexa uma tabela que o servidor passou, e por algum caminho o servidor não passou nada.
TriggerClientEvent('x', src)sem carga dá nil para o handler. - 4
Um wrapper que não devolveu nada
Os nativos não devolvem tabelas, mas um auxiliar em volta de um pode devolver nil para uma entidade inválida, e quem chama indexa isso.
- 5
A ordem de carga
O arquivo que define a tabela está listado DEPOIS do arquivo que a usa no fxmanifest, então no momento do uso ela ainda não existe.
Como saber qual é o seu
Imprima o contêiner, não o campo, logo acima da linha que falha:
print(json.encode(Config.Something))
Se imprimir null, o problema é o contêiner e o campo é pista falsa. Se o nome entre parênteses é um global do framework, adicione uma espera e veja se o erro se move: um problema de tempo some, uma chave que falta não.
Onde olhar
Abra o arquivo e a linha da pilha. Leia a instrução inteira, não só o que está antes do ponto: em a.b.c.d qualquer um entre a, a.b ou a.b.c pode ser o nil, e o nome entre parênteses diz qual.
Como consertar
Para o tempo do framework, nunca leia o objeto em nível de arquivo:
local PlayerData = {}
RegisterNetEvent('esx:playerLoaded', function(xPlayer)
PlayerData = xPlayer
end)
-- quando você realmente precisa dele durante a inicialização:
CreateThread(function()
while not ESX or not ESX.IsPlayerLoaded() do Wait(100) end
-- daqui para baixo é seguro
end)Para todo o resto, proteja antes de indexar:
local entry = Config.Jobs[job] if not entry then return end
Ainda travado no seu próprio código?
Esta página é o que esse erro costuma significar. Cole o seu console no Server Fixer e ele vai ordenar tudo o que estiver lá e te dizer o que fazer primeiro; e se você preferir não mexer, o ORBIE consegue consertar o script e te devolver o resource pronto para soltar.
bug_reportAbrir o Server FixerPara esse tipo de erro, o Script Optimizer lê o script e conserta o código por trás disso.
Erros que andam junto com este
- tentativa de chamar um valor nil
- PlayerData está vazio ou ainda não carregou
- O objeto do framework é nil (ESX / QBCore)
- não dá para retomar uma corrotina morta
- SCRIPT ERROR em citizen:/scripting/lua/scheduler.lua
- tentativa de indexar um número, booleano ou texto
- tentativa de yield através de um limite de chamada em C
- estouro de pilha
- o índice da tabela é nil