loadfile()和dostring()不能在内部运行(wsapi_env)

时间:2011-08-18 07:48:58

标签: lua

我尝试运行以下代码:

#!/usr/bin/env wsapi.cgi

require("lib/request")  -- wsapi lib
require("lib/response")
require("io")
module("loadHtml", package.seeall)

---This function generates a response for the WSAPI calls that need to GET a file
function run(wsapi_env)
    --check the request
    local req = wsapi.request.new(wsapi_env or {})
    --generate response
    res = wsapi.response.new()
    ---a couple of utility functions that will be used to write something to response
    function print(str) res:write(str) end
    function println(str) res:write(str) res:write('<br/>') end

    println("running...")
    ff=dofile("index.html.lua")
    println("done!")

    return res:finish()
end

return _M

“index.html.lua”看起来像这样:

print([[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
Hello world!
</html>]])

它运行没有错误,但我在客户端获得的正是这样:

running...<br/>done!<br/>

换句话说,run()函数中的println()有效,但它在“index.html.lua”中不起作用。我尝试了loadfile()而不是dofile(),它是一样的。有趣的是,我写了一个测试代码并且它有效:

--tryDoFileRun.lua:
function e()
    function p(str)
        print(str)
    end
    dofile("tryDoFile.lua")
end
e()

运行这个:

--tryDoFile.lua
print("in tryDoFile.lua")
p("calling p")

,输出为:

in tryDoFile.lua
calling p

应该如此。但是,同样的想法在上面的第一个代码中不起作用。 如何让这段代码让index.html.lua使用我的print()函数?

系统规范:WSAPI,Lighttpd服务器,LUA 5.1,ARM9,Linux 2.6

1 个答案:

答案 0 :(得分:1)

问题出在module电话中。它取代了当前块的环境,但dofile不会继承修改后的环境。解决方案是直接写入全球环境:

_G.print = function(str) res:write(str) end

或者修改加载的代码块的环境:

function print(str) res:write(str) end
ff = loadfile("index.html.lua")
getfenv(ff).print = print
ff()

后者可以包装在方便的HTML模板加载函数中。