KrakenD CE中Lua使用报错排查:字符串函数无法正常工作
KrakenD CE Lua脚本报错:attempt to index a non-table object
你的错误根源是没有正确处理KrakenD Lua API返回的json.Token类型,而非Lua字符串模块不可用。response:data()返回的不是原生Lua表,而是KrakenD封装的json.Token对象,直接调用get方法时,如果后端返回的JSON不是对象类型(比如是数组、纯字符串等),就会触发“attempt to index a non-table object”错误。
解决方案1:将Token转换为原生Lua表(推荐)
修改Lua脚本,先把response:data()返回的Token转换为Lua表,再通过键名直接访问字段:
function log_backend_response(response) safe_log("---------- REPONSE BACKEND ----------", "[BACKEND-IN]") -- 将json.Token转换为原生Lua表 local responseData = response:data():as_table() -- 通过键名获取imei字段 local imei = responseData.imei -- 先判断字段是否存在,避免nil相关错误 if imei then safe_log("IMEI: " .. imei, "INFO") local imei_str = tostring(imei) local result = imei_str:sub(1, 8) safe_log("IMEI前8位: " .. result, "INFO") else safe_log("响应中未找到imei字段", "WARNING") end end
解决方案2:判断Token类型后使用get方法
如果需要保留Token类型的操作逻辑,可以先检查Token的类型,确保是对象后再调用get方法:
function log_backend_response(response) safe_log("---------- REPONSE BACKEND ----------", "[BACKEND-IN]") local responseData = response:data() -- 检查当前Token是否为JSON对象类型 if responseData:type() ~= 'object' then safe_log("响应数据不是JSON对象,无法通过get方法获取字段", "ERROR") return end local imei = responseData:get('imei') if imei then safe_log("IMEI: " .. imei, "INFO") local imei_str = tostring(imei) local result = imei_str:sub(1, 8) safe_log("IMEI前8位: " .. result, "INFO") else safe_log("响应中未找到imei字段", "WARNING") end end
额外检查事项
- 确认后端返回的JSON结构是否为包含
imei字段的对象,示例正确结构:
如果后端返回的是数组(如{"imei": "123456789012345"}[{"imei": "123456789012345"}]),需要先遍历数组再提取字段。 - 无需使用Go插件,KrakenD CE的Lua集成完全支持标准Lua字符串库,问题解决后
sub等函数即可正常工作。
内容的提问来源于stack exchange,提问作者KnowledgeSeeker
相关产品推荐
相关产品推荐

