2010-11-27 4 views
3

Я пытаюсь сделать работу Enes Erlang в режиме mode_esi и запустить некоторую функцию. Так что, далеко, мне это не удалось. Может ли кто-нибудь опубликовать минимальный пример того, как запускать Inets, чтобы URL-адрес http:localhost:8099/esi/my_mod:foo вызывал метод my_mod:foo/3?Рабочий пример для интерфейса сервера Erlang

Дополнение: Я начал 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 с конфигурационным файлом (измененная версия inets/examples/server_root/conf/8080.conf). Я полагаю, что примерный файл содержит более полный список свойств, которые необходимы Inets, чем то, что я перечислял в inets:start(httpd, [...]). Если кто-то столкнется с проблемой Inets в будущем, мой совет - начать с примера конфигурации.

0

Ок, здесь идет:

  1. набор {erl_script_alias, {"/esi", [my_mod]}} для веб-сервера inets, поэтому модуль принимается.
  2. my_mod. Что-то вроде:

    -module(my_mod). 
    -export([foo/3]). 
    
    
    foo(SessID, _Env, _Input) -> 
        mod_esi:deliver(SessID, ["Data ", <<"as">>, " an iolist"]). 
    
  3. Убедитесь, что mod_esi является частью inets секции под названием модуля: {modules, [.., mod_esi, ..}}
  4. Этот шаг очень важен: Дышите 3 раза, повторять святые слова: «Я молю тебя, inets, что вы будете работа на этот раз ». Скрестите пальцы.
  5. Выпить чашечку кофе. Чай не будет делать. Это должен быть кофе.
  6. Наслаждайтесь веб-сервером.
+0

Я обновил этот вопрос с не-рабочим примером. Что я там делаю неправильно? Кажется, простая версия того, что вы написали. – 2010-11-27 18:11:42

1

Чтобы уточнить, что уже было сказано, я приведу рабочий пример (с нуля). Это, чтобы помочь тем, кто пришел сюда из Google, в основном, потому что это, как я нашел его;)

Во-первых, создать модуль:

# 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

Затем запустите оболочку из Баша

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

Надеется, что это помогает кто-то :)

Смежные вопросы