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

Lua脚本报错attempt to index a boolean value (local 'user')如何解决

报错根因

报错SCRIPT ERROR: @shops/server.lua:71: attempt to index a boolean value (local 'user')的核心原因是exports["np-base"]:getModule("Player"):GetUser(src)返回了布尔值(通常为false,代表未匹配到对应玩家实例),后续代码直接对布尔值调用removeMoney方法导致逻辑中断,资金扣除失败。

排查与修复步骤
  • 第一步:增加空值拦截,避免逻辑中断
    先对获取到的user对象做合法性判断,异常情况直接终止逻辑并打印调试日志,临时解决控制台报错问题:
    RegisterServerEvent('cash:remove')
    AddEventHandler('cash:remove', function(src,amount)
        local user = exports["np-base"]:getModule("Player"):GetUser(src)
        -- 新增用户对象合法性校验
        if type(user) ~= 'table' or not user.removeMoney then
            print("[商店扣款异常] 无效玩家对象,玩家ID:" .. tostring(src))
            return
        end
        local realAmount = tonumber(amount)
        if not realAmount or realAmount <= 0 then
            print("[商店扣款异常] 无效扣款金额,参数值:" .. tostring(amount))
            return
        end
        user:removeMoney(realAmount)
    end)
    
  • 第二步:定位src参数异常原因
    新增调试日志打印传入的src参数类型和取值,排查异常场景:
    • 确认是否存在事件触发时玩家已经离线,导致ID失效
    • 确认是否是客户端恶意篡改事件参数,传入了不存在的玩家ID
    • 确认商店逻辑触发cash:remove事件时,是否正确传入了服务端生成的玩家ID,而非客户端本地的错误ID
  • 第三步:校验玩家加载状态
    检查np-base框架的GetUser方法规则,部分框架在玩家刚进入服务器、身份数据未加载完成时,也会返回false,可在事件触发前增加玩家加载完成状态判断,避免提前触发扣款逻辑。
  • 第四步:增加事件权限校验
    如果cash:remove事件允许客户端直接触发,需增加来源校验,只允许合法的商店流程调用该事件,避免恶意刷物品的安全问题。
验证方案

修复完成后,分别模拟以下场景测试:

  • 正常登录玩家执行商店购买,确认资金正常扣除、无报错
  • 购买过程中强制下线,确认服务端无报错、无异常数据
  • 传入非法玩家ID、负数金额等异常参数,确认服务端拦截正常、无报错

内容的提问来源于stack exchange,提问作者scar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:45:06