在FreeSWITCH中控制IVR流程或者处理IVR中的一些逻辑事务时,lua扮演着一个重要角色,有时我们需要向脚本中传递一些参数,并且lua脚本也支持该功能。但是在FS中使用lua向脚本传递参数的时候,有一点需要注意:lua脚本中的接收参数的表名是argv,而不是普通lua脚本中的arg。
我在调用脚本的时候,需要向脚本中传递一个音频的文件名,(下面是脚本中的部分内容)
local fileName = arg[1]; --获取文件名
--freeswitch.consoleLog("INFO", "fileName:"..fileName);
print(fileName);
这样写,在命令行中,直接使用
lua /usr/local/freeswitch2/scripts/yuxxx.lua test
在命令行中,会正确输出test,但是在FS中通过 <action application="lua" data="${path}/scripts/yuxxx.lua ${fileName}.wav" />
则会出现错误信息 [ERR] mod_lua.cpp:203 /usr/local/freeswitch2/scripts/yuxxx:1: attempt to index global 'arg' (a nil value)
stack traceback:
/usr/local/freeswitch2/scripts/yuxxx.lua:1: in main chunk
通过搜索资料,在WIKI上看到资料,里面有关于参数传递的部分,里面说是使用argv对象来获取传递的参数
将脚本中的arg换成argv,再在FS环境中通过lua来调用该脚本,并传递参数,果然正常了。
但是,随后又直接在命令行中使用
lua /usr/local/freeswitch2/scripts/yuxxx.lua test
则又会出现错误
lua: /usr/local/freeswitch2/scripts/yuxxx.lua:1: attempt to index global 'argv' (a nil value)
stack traceback:
/usr/local/freeswitch2/scripts/yuxxx.lua:1: in main chunk
[C]: in ?
一个问题折腾了一下午,虽然最后问题解决了,但还是不知道为啥会这样。。。