我正在尝试让Erlang的Inets mode_esi工作并运行一些功能。所以,到目前为止,我没有成功。有人可以发布一个如何运行Inets的最小示例,以便像http:localhost:8099/esi/my_mod:foo
这样的网址会调用方法my_mod:foo/3
吗?
另外:我已经使用这些命令启动了inets:
inets:start(),
inets:start(httpd, [{port, 8099}, {server_name, "localhost"}, {document_root, "."},
{server_root, "."}, {erl_script_alias, {"/esi", [my_esi, io]}}]).
该模块是:
-module(my_esi).
-export([foo/3]).
foo(Sid, Env, In) -> mod_esi:deliver(Sid, ["bla"]).
但浏览到http://localhost:8099/esi/my_esi:foo
会导致错误消息。
答案 0 :(得分:1)
我自己解决了。出于某种原因,超出我的理解,当我使用配置文件(inets/examples/server_root/conf/8080.conf
的修改版本)调用Inets时,完全相同的代码工作。我想这个示例文件包含了一个比我在inets:start(httpd, [...])
中列出的更完整的Inets属性列表。如果将来有人遇到Inets问题,我的建议是从示例配置开始。
答案 1 :(得分:1)
为了澄清已经说过的话,我将给出一个有效的例子(从头开始)。这是为了帮助那些从谷歌来到这里的人,主要是因为这是我发现它的方式;)
首先,创建模块:
# filename: my_esi.erl
-module(my_esi).
-export([foo/3,bar/3]).
foo(Sid, Env, In) -> mod_esi:deliver(Sid, ["foo"]).
bar(Sid, Env, In) -> mod_esi:deliver(Sid, ["bar"]).
保存,然后编译:
erlc my_esi.erl
你现在有my_esi.beam
然后从bash运行shell
erl
在shell中键入以下内容:
inets:start().
{Httpd_State,Httpd_Pid} = inets:start(httpd, [{port, 8099}, {server_name, "localhost"}, {document_root, "."}, {modules,[mod_esi]},{server_root, "."}, {erl_script_alias, {"/esi", [my_esi, io]}}]).
这里的重要部分是:
{modules,[mod_esi]}
如果您需要其他模块,请将它们附加到列表中加载它们。
澄清如何/为何:
我首先承认起初看起来确实有些奇怪,而且文档的帮助不如我所希望的那样。但是,我意识到:
modules() -> [atom()]
变为:
{modules, [mod_access, mod_esi, ..., etc.]}
希望它可以帮助某人:)
答案 2 :(得分:0)
好的,这里是:
{erl_script_alias, {"/esi", [my_mod]}}
网络服务器设置inets
,以便接受该模块。撰写my_mod
。类似的东西:
-module(my_mod).
-export([foo/3]).
foo(SessID, _Env, _Input) ->
mod_esi:deliver(SessID, ["Data ", <<"as">>, " an iolist"]).
mod_esi
属于名为inets
{modules, [.., mod_esi, ..}}
部分