在两个Lua文件之间传递会话

我想从我的主脚本调用另一个lua脚本,例如 session:execute("lua","/path/somefile.lua "..somearg1.." "..somearg2..) 它可以正常工作,somefile.lua正在执行,但是假设我还想在那里使用会话,即在somefile.lua中访问数据库并希望通过使用session发言查询结果。 (session:speak(queryResult))。

我还尝试将会话作为一个参数发送 session:execute("lua","/path/somefile.lua "..session) 但它会给出错误“尝试将全局“session”连接(userdata值)”。

第一个lua文件的代码

session:answer();
session:setAutoHangup(false);
session:set_tts_params("flite","kal");
callerId = session:getVariable("caller_id_number");
session:execute("lua ","/etc/freeswitch/scripts/checkbal.lua "..callerId.." "..session);
session:destroy();

第二个lua文件的代码

callerId=argv[1];
session=argv[2];
luasql = require "luasql.postgres";
env=assert(luasql:postgres());
con=assert(env:connect("mydb","postgres","password","127.0.0.1","5432"));
cur=assert(con:execute("select balance from bal where number='"..callerId.."'"));
session:set_tts_params("flite","kal");
row=cur:fetch({},"a");
res=row.balance;
session:speak(res);
点赞
用户869951
用户869951

将第二个文件设置为一个模块,它返回一个函数或函数表。以下是一个示例,第二个文件返回一个“speak”函数,您可以重复使用它多次:

第一个 Lua 文件的代码:

session:answer()
session:setAutoHangup(false)
session:set_tts_params("flite","kal")
callerId = session:getVariable("caller_id_number")
speak = require 'checkbal'
speak(session, callerId)
-- session:execute("lua ","/etc/freeswitch/scripts/checkbal.lua "..callerId.." "..session)
session:destroy()

第二个 Lua 文件的代码:

luasql = require "luasql.postgres"

local env=assert(luasql:postgres())
local con=assert(env:connect("mydb","postgres","password","127.0.0.1","5432"))

local function speak(session, callerId)
    local cur = assert(con:execute("select balance from bal where number='"..callerId.."'"))
    session:set_tts_params("flite","kal")
    row=cur:fetch({},"a")
    res=row.balance
    session:speak(res)
end

return speak

注意:这是 Lua:不需要分号。

我会将“session”设置为一个对象(具有方法的表),并带有“speak”方法,但这超出了此问题的范围,也不是必需的,可能会在后来编写可维护代码时导致更多的问题。

2014-03-15 15:58:27