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

View File

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