You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 01:24:14