refactor(lua): 简化 ngx API 表注册流程

将 ngx 表的创建和全局设置提前,避免各 API 注册时重复检查表是否存在。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
xfy 2026-04-11 13:34:26 +08:00
parent 6b9df86217
commit b31733f233
2 changed files with 7 additions and 13 deletions

View File

@ -30,9 +30,10 @@ func newNgxRespAPI(ctx *fasthttp.RequestCtx) *ngxRespAPI {
// RegisterNgxRespAPI 在 Lua 状态机中注册 ngx.resp API
// 这是主入口函数,由 LuaEngine 在初始化时调用
func RegisterNgxRespAPI(L *glua.LState, api *ngxRespAPI) {
// 获取已存在的 ngx 表,如果不存在则创建
// 获取已存在的 ngx 表(必须已设置全局)
ngx := L.GetGlobal("ngx")
if ngx == nil || ngx.Type() != glua.LTTable {
// 如果不存在,创建新表并设置全局
ngx = L.NewTable()
L.SetGlobal("ngx", ngx)
}

View File

@ -169,15 +169,11 @@ func (c *LuaCoroutine) setupSecureCoroutineLib() {
// setupNgxAPI 创建 ngx API
// 注册 ngx.req、ngx.resp、ngx.var、ngx.ctx、ngx.log 和 ngx.socket API
func (c *LuaCoroutine) setupNgxAPI() {
// 检查是否已有 ngx 表(可能已由其他 API 注册)
existingNgx := c.Co.GetGlobal("ngx")
var ngx *glua.LTable
if existingTbl, ok := existingNgx.(*glua.LTable); ok {
ngx = existingTbl
} else {
// 创建 ngx 表
ngx = c.Co.NewTable()
}
// 创建 ngx 表
ngx := c.Co.NewTable()
// 先设置到全局,让所有注册函数使用同一个 ngx 表
c.Co.SetGlobal("ngx", ngx)
// 注册 ngx.req API
if c.RequestCtx != nil {
@ -203,9 +199,6 @@ func (c *LuaCoroutine) setupNgxAPI() {
// 注册 ngx.socket API
RegisterTCPSocketAPI(c.Co, c.Engine)
// 将 ngx 表设置到协程环境
c.Co.SetGlobal("ngx", ngx)
}
// Execute 在协程中执行 Lua 脚本(支持 Yield/Resume