KrakenD Lua脚本加载cjson库触发运行时错误求助
KrakenD Lua引入cjson触发slice bounds out of range错误的解决办法
问题场景
配置KrakenD端点后,在Lua脚本中添加require("cjson")语句,触发运行时panic错误。
KrakenD端点配置
{ "endpoint": "/apps/{id}", "output_encoding": "no-op", "method": "GET", "backend": [ { "host": [ "http://xxx.yyy.zz:8888" ], "url_pattern": "/apps/{id}", "extra_config": { "modifier/lua-backend": { "sources": [ "/etc/krakend/Hello.lua" ], "post": "local r = response.load(); printPostBody(r:body());", "allow_open_libs": true } } } ] }
Hello.lua代码
local mylua = require("cjson") function printPostBody(body) print(body); end
运行时错误日志
2023/10/08 09:36:23 [Recovery] 2023/10/08 - 09:36:23 panic recovered: runtime error: slice bounds out of range [-1:] /usr/local/go/src/runtime/panic.go:153 (0xf3dc7e) /go/pkg/mod/github.com/krakendio/binder@v0.0.0-20230413105421-1bbe94e65f45/error.go:140 (0x1971f64) /go/pkg/mod/github.com/krakendio/binder@v0.0.0-20230413105421-1bbe94e65f45/binder.go:27 (0x1970866) /go/pkg/mod/github.com/krakendio/binder@v0.0.0-20230413105421-1bbe94e65f45/error.go:201 (0x1972397) /go/pkg/mod/github.com/krakendio/binder@v0.0.0-20230413105421-1bbe94e65f45/binder.go:43 (0x19707ee) /go/pkg/mod/github.com/krakendio/binder@v0.0.0-20230413105421-1bbe94e65f45/binder.go:26 (0x1970785) /go/pkg/mod/github.com/krakendio/krakend-lua/v2@v2.1.2/proxy/proxy.go:75 (0x1979793) /go/pkg/mod/github.com/luraproject/lura/v2@v2.3.0/proxy/balancing.go:77 (0x13080a8) /go/pkg/mod/github.com/luraproject/lura/v2@v2.3.0/proxy/http.go:113 (0x130db84) /go/pkg/mod/github.com/luraproject/lura/v2@v2.3.0/router/gin/endpoint.go:50 (0x1bbf674) /go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174 (0x1bb49c1) /go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/recovery.go:102 (0x1bb49ac) /go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174 (0x1bb3ae6) /go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/logger.go:240 (0x1bb3ac9) /go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174 (0x1bb296a) /go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/gin.go:620 (0x1bb25f1) /go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/gin.go:576 (0x1bb211c) /usr/local/go/src/net/http/server.go:2936 (0x128a0b5) /usr/local/go/src/net/http/server.go:1995 (0x1285251) /usr/local/go/src/runtime/asm_amd64.s:1598 (0xf761a0)
问题分析
错误栈显示panic来自KrakenD的binder库,根源是Lua模块加载cjson时,沙箱环境无法正确处理第三方库的加载流程,导致内部切片越界。即使只是require而未使用cjson,加载过程本身就触发了bug。另外,官方KrakenD默认发行版通常不内置cjson模块,手动引入会导致加载失败,进而触发底层panic。
解决方案
1. 使用KrakenD内置JSON工具替代cjson
KrakenD的Lua沙箱已经内置了JSON处理函数,无需额外引入cjson,直接使用json.decode()和json.encode()即可:
-- 移除local mylua = require("cjson") function printPostBody(body) -- 示例:如果需要解析JSON local json_data = json.decode(body) print(body) end
2. 自定义编译KrakenD以包含cjson(可选)
如果必须使用cjson,需要确保KrakenD是自定义编译的,编译时包含cjson依赖:
- 克隆KrakenD源码,添加Lua cjson依赖到编译配置
- 重新编译生成KrakenD二进制文件
3. 升级/降级KrakenD Lua模块
当前使用的krakend-lua/v2@v2.1.2可能存在已知bug,尝试升级到最新稳定版本,或者降级到v2.1.0等版本,看是否修复了切片越界问题。
验证
修改Lua代码后,重启KrakenD,调用/apps/{id}端点,确认错误日志不再出现,print(body)能正常输出内容。
内容的提问来源于stack exchange,提问作者emoleumassi
相关产品推荐
相关产品推荐

