我尝试运行以下代码:
#!/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
答案 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模板加载函数中。