3

我正在尝试使 Erlang 的 Inets mode_esi 工作并运行一些功能。所以,到目前为止,我没有成功。有人可以发布一个如何运行 Inets 的最小示例,以便像这样的 urlhttp: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导致错误消息。

4

3 回答 3

2

为了澄清已经说过的内容,我将给出一个工作示例(从头开始)。这是为了帮助那些从谷歌来到这里的人,主要是因为我是这样找到它的;)

首先,创建模块:

# 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.]}

希望它可以帮助某人:)

于 2011-01-20T01:39:07.967 回答
1

我自己解决了。出于某种原因,超出我的理解,当我使用配置文件(的修改版本)调用 Inets 时,完全相同的代码工作inets/examples/server_root/conf/8080.conf。我想示例文件包含的属性列表比我在inets:start(httpd, [...]). 如果以后有人遇到 Inets 问题,我的建议是从示例配置开始。

于 2010-11-28T10:45:29.233 回答
0

好的,这里是:

  1. {erl_script_alias, {"/esi", [my_mod]}}inetsWeb 服务器设置,因此该模块被接受。
  2. my_mod。就像是:

    -module(my_mod).
    -export([foo/3]).
    
    
    foo(SessID, _Env, _Input) ->
      mod_esi:deliver(SessID, ["Data ", <<"as">>, " an iolist"]).
    
  3. 确保mod_esiinets称为模块的部分的一部分:{modules, [.., mod_esi, ..}}
  4. 这一步非常重要:呼吸 3 次,背诵圣言“我向你祈祷,inets,这次你会工作”。交叉你的手指。
  5. 喝一杯咖啡。茶不行。它必须是咖啡。
  6. 享受您的网络服务器。
于 2010-11-27T16:14:37.617 回答