Lua报错:attempt to call a nil value (upvalue 'successCB')求助
解决
attempt to call a nil value (upvalue 'successCB')错误 问题根源
这个错误说明执行successCb()时,该变量的值为nil——也就是回调函数没有被正确赋值就被调用了。结合你的代码来看,主要有以下几种可能:
解决方案
1. 修正变量名大小写(Lua大小写敏感)
Lua对变量名大小写严格区分,错误提示里的是successCB(大写CB),但你的代码中写的是successCb(小写Cb)。统一所有涉及该回调的变量名拼写:
- 如果错误提示无误,把代码里的
successCb全部替换为successCB; - 如果是提示笔误,确保所有地方的变量名完全一致。
2. 确保openCode被正确调用且传入有效回调
successCb的值来自openCode函数的success参数,若调用openCode时:
- 未传入
success参数,或传入的是nil; - 调用
openCode的时机晚于NUICallback触发;
都会导致successCb为nil。检查调用openCode的代码,确保传入有效的函数作为回调:
openCode(true, "1234", function() -- 这里写授权成功后的逻辑 print("授权完成,执行后续操作") end, function() -- 授权失败的逻辑 end)
3. 改用闭包传递回调(更安全的写法)
全局变量容易出现覆盖或未赋值问题,建议通过闭包捕获回调,避免依赖全局变量:
function openCode(show, code, success, fail) display = true SetNuiFocus(true, true) -- 注册NUICallback时用闭包直接捕获success/fail参数 RegisterNUICallback("main", function(data) SetNuiFocus(false, false) QBCore.Functions.Notify("Authorization Success" , 'success', 7500) if success then success() end -- 先判断再调用,避免nil报错 RemoveNuiCallback("main") -- 执行后注销回调,防止重复注册 end) RegisterNUICallback("failed", function(data) SetNuiFocus(false, false) if fail then fail() end RemoveNuiCallback("failed") end) SendNUIMessage({ type = "open", code = code, }) end
这种写法每次调用openCode都会绑定对应的回调,从根源上避免全局变量未赋值的问题。
4. 调用前增加nil判断(临时兼容方案)
如果暂时不想改结构,在调用回调前先判断是否为nil,避免报错:
RegisterNUICallback("main", function(data) SetNuiFocus(false, false) QBCore.Functions.Notify("Authorization Success" , 'success', 7500) if successCb then -- 先检查变量是否存在 successCb() else print("错误:successCb未被赋值") end end)
内容的提问来源于stack exchange,提问作者bro xoty
相关产品推荐
相关产品推荐

