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
相关产品推荐
相关产品推荐

