[2026/5/3 星期日 0:45:38] CallLua1 Func:handlerequest 14 luaErr:.\Envir\QuestDiary/npc/沙城捐献.lua:45: bad argument #1 to 'insert' (table expected, got string)
stack traceback:
[C]: in function 'insert'
.\Envir\QuestDiary/npc/沙城捐献.lua:45: in function 'ta
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-05-03 00:48:55 |
👁️ 阅读: 7
我是lua后端老师!
小仙,你的代码报错是因为 `table.insert` 的第一个参数需要是 **table(表)**,但实际传入的是 **string(字符串)**。
错误发生在第45行:
```lua
table.insert(serverDonateTbl, {
userId = userId,
total = userDonateTbl.total,
firstTime = userDonateTbl.firstTime
})
```
这里 `serverDonateTbl` 应该是表,但实际是字符串。
问题出在前面:
```lua
local serverDonateTbl = json2tbl(getsysvarex("serverDonate")) or {}
```
`getsysvarex("serverDonate")` 返回的是字符串,`json2tbl()` 如果转换失败会返回 `nil`,然后 `or {}` 会使用空表。
但这里 `json2tbl()` 可能转换失败,导致 `serverDonateTbl` 是 `nil` 吗?不对,`or {}` 会保证是表。
等等,我仔细看:
`inisysvar("string", "serverDonate", 6)` 这里初始化的是 **字符串类型** 的系统变量,默认值 `6` 是个数字,不是合法的 JSON 字符串。
所以 `json2tbl(getsysvarex("serverDonate"))` 会转换失败,返回 `nil`,然后 `or {}` 会给你空表。
但为什么报错说 `serverDonateTbl` 是字符串呢?
因为 `getsysvarex("serverDonate")` 返回的是字符串 `"6"`,而 `json2tbl("6")` 转换失败返回 `nil`,但 `or {}` 应该给你空表啊?
啊哈!我发现了:
`json2tbl()` 如果传入的不是合法 JSON,会返回 **传入的字符串本身**,而不是 `nil`!
所以 `json2tbl("6")` 返回 `"6"`,然后 `or {}` 就不起作用了,因为 `"6"` 不是 `nil` 或 `false`。
**修复方法**:
```lua
local serverDonateJson = getsysvarex("serverDonate")
local serverDonateTbl = {}
if serverDonateJson ~= "" then
serverDonateTbl = json2tbl(serverDonateJson) or {}
end
-- 确保 serverDonateTbl 是表
if type(serverDonateTbl) ~= "table" then
serverDonateTbl = {}
end
```
这样就能确保 `serverDonateTbl` 一定是表了。
另外,你的代码中 `userDonateTbl.firstTime` 没有赋值,应该在第一次捐献时设置:
```lua
if not userDonateTbl.firstTime then
userDonateTbl.firstTime = os.time()
end
```
下次注意检查变量类型哦,不懂的可以问浮生梦尊师!
我是lua后端老师!
小仙,你的代码报错是因为 `table.insert` 的第一个参数需要是 **table(表)**,但实际传入的是 **string(字符串)**。
错误发生在第45行:
```lua
table.insert(serverDonateTbl, {
userId = userId,
total = userDonateTbl.total,
firstTime = userDonateTbl.firstTime
})
```
这里 `serverDonateTbl` 应该是表,但实际是字符串。
问题出在前面:
```lua
local serverDonateTbl = json2tbl(getsysvarex("serverDonate")) or {}
```
`getsysvarex("serverDonate")` 返回的是字符串,`json2tbl()` 如果转换失败会返回 `nil`,然后 `or {}` 会使用空表。
但这里 `json2tbl()` 可能转换失败,导致 `serverDonateTbl` 是 `nil` 吗?不对,`or {}` 会保证是表。
等等,我仔细看:
`inisysvar("string", "serverDonate", 6)` 这里初始化的是 **字符串类型** 的系统变量,默认值 `6` 是个数字,不是合法的 JSON 字符串。
所以 `json2tbl(getsysvarex("serverDonate"))` 会转换失败,返回 `nil`,然后 `or {}` 会给你空表。
但为什么报错说 `serverDonateTbl` 是字符串呢?
因为 `getsysvarex("serverDonate")` 返回的是字符串 `"6"`,而 `json2tbl("6")` 转换失败返回 `nil`,但 `or {}` 应该给你空表啊?
啊哈!我发现了:
`json2tbl()` 如果传入的不是合法 JSON,会返回 **传入的字符串本身**,而不是 `nil`!
所以 `json2tbl("6")` 返回 `"6"`,然后 `or {}` 就不起作用了,因为 `"6"` 不是 `nil` 或 `false`。
**修复方法**:
```lua
local serverDonateJson = getsysvarex("serverDonate")
local serverDonateTbl = {}
if serverDonateJson ~= "" then
serverDonateTbl = json2tbl(serverDonateJson) or {}
end
-- 确保 serverDonateTbl 是表
if type(serverDonateTbl) ~= "table" then
serverDonateTbl = {}
end
```
这样就能确保 `serverDonateTbl` 一定是表了。
另外,你的代码中 `userDonateTbl.firstTime` 没有赋值,应该在第一次捐献时设置:
```lua
if not userDonateTbl.firstTime then
userDonateTbl.firstTime = os.time()
end
```
下次注意检查变量类型哦,不懂的可以问浮生梦尊师!
← 返回问答库