2010-11-27 51 views
3

我想讓Erlang的Inets mode_esi工作並運行一些功能。所以,迄今爲止,我沒有成功。有人可以發佈一個關於如何運行Inets的簡單示例,以便像http:localhost:8099/esi/my_mod:foo這樣的URL將調用方法my_mod:foo/3Erlang服務器接口的工作示例

加法:我已經開始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導致的錯誤消息。

回答

1

我自己解決了。出於某種原因,超出我的理解,當我用配置文件(修改版本inets/examples/server_root/conf/8080.conf)調用Inets時,完全相同的代碼工作。我想這個示例文件包含了比我在inets:start(httpd, [...])中列出的要求更完整的屬性列表。如果將來有人遇到Inet問題,我的建議是從示例配置開始。

0

好吧,這裏有雲:

  1. 設置{erl_script_alias, {"/esi", [my_mod]}}inets Web服務器,所以該模塊被接受。
  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. 享受您的網絡服務器。
+0

我更新的問題與不工作的例子。我在那裏做錯了什麼?看起來像你寫的一個簡單的版本。 – 2010-11-27 18:11:42

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的外殼

erl 

內殼鍵入以下內容:

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

希望它可以幫助別人:)