作者回复: 你是指为什么一个类型是 table,一个报错时候的类型是function?
首先 ngx 确实是一个 table,其次 cjson 里面报错的源码在这里 https://github.com/mpx/lua-cjson/blob/master/lua_cjson.c#L457:
luaL_error(l, "Cannot serialise %s: %s",
lua_typename(l, lua_type(l, lindex)), reason);
它是用 lua_typename(l, lua_type(l, lindex)) 来判断数据类型的。我估计 lua_type 判断 ngx 的时候出错了。但我并没有跟到代码中去确认,你可以看下具体的判断代码。
作者回复: 对于这种请求,我更喜欢 # 操作符,table_nkeys里面还是有不少判断逻辑的。性能我没有测试,应该是#更好一些。
作者回复: 第一个问题,你的做法是正确的,在 OpenResty 中也是用正则来判断时间的。你可以看下 lua-nginx-module 中 012-now.t 这个测试案例的做法;
第二个,上游都是可以在测试案例中模拟出来的,比如:https://github.com/iresty/apisix/blob/master/t/APISix.pm#L79