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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 15:53:15