• helloworld
    2019-08-04
    ngx.say(type(ngx))输出table
    ngx.say(cjson.encode(ngx))为什么无法序列化ngx,报错提示不能对函数做序列化。
    老师,这个是什么原因呢

    作者回复: 你是指为什么一个类型是 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 的时候出错了。但我并没有跟到代码中去确认,你可以看下具体的判断代码。

    
    
  • helloworld
    2019-08-02
    local table_nkeys = require "table.nkeys"

    foo = {1, 2, 3, "bar"}

    item_count = #foo
    item_count_ = table_nkeys(foo)

    老师,这两种获取table元素个数的方法,哪个效率更高
    展开

    作者回复: 对于这种请求,我更喜欢 # 操作符,table_nkeys里面还是有不少判断逻辑的。性能我没有测试,应该是#更好一些。

    
    
  • Geek_41dcba
    2019-08-02
    感谢老师,让我对openresty有了比较全面的认识。但目前在写测试用例跑CI时,还是有一些无从下

    1. 某一个用例对系统环境有要求,比喻依赖时间,我想要模拟在一天中某段时间执行代码其他时间不执行,或者响应内容中表示时间字段的内容精度要求很高,如何去验证这个精度(我现在都做法是like方式去正则匹配,这个字段的内容是根据当前时间生成,猜测一个大概的时间)

    2. 如何模拟一个用户请求,出现多级的upstream(模拟多级缓存不存在是服务端发起uostream的场景)
    展开

    作者回复: 第一个问题,你的做法是正确的,在 OpenResty 中也是用正则来判断时间的。你可以看下 lua-nginx-module 中 012-now.t 这个测试案例的做法;
    第二个,上游都是可以在测试案例中模拟出来的,比如:https://github.com/iresty/apisix/blob/master/t/APISix.pm#L79

    
    
我们在线,来聊聊吧