2015-08-31 2 views
2

Хорошо, что я делаю неправильно здесь. Я пробую простой пример встроенных YAWs от http://yaws.hyber.org/embed.yaws, но с приложением. Я добавил файл my_app.erl и скомпилировал его. Он работает, если не во встроенных YAW, поэтому я считаю, что он специфичен для встроенных.YAWs встроенный с appmod не работает для меня

-module(ybed). 
-compile(export_all). 

start() -> 
    {ok, spawn(?MODULE, run, [])}. 

run() -> 
    Id = "embedded", 
    GconfList = [{ebin_dir, ["/Users/someuser/yawsembedded/ebin"]}], 
    Docroot = "/Users/someuser/yawstest", 
    SconfList = [{port, 8888}, 
       {listen, {0,0,0,0}}, 
       {docroot, Docroot}, 
       {appmods, [{"/", my_app}]} 
       ], 
    {ok, SCList, GC, ChildSpecs} = 
     yaws_api:embedded_start_conf(Docroot, SconfList, GconfList), 
    [supervisor:start_child(ybed_sup, Ch) || Ch <- ChildSpecs], 
    yaws_api:setconf(GC, SCList), 
    {ok, self()}. 

Получение этой ошибки:

ERROR erlang code threw an uncaught exception: 
File: appmod:0 
Class: error 
Exception: undef 
Req: {http_request,'GET',{abs_path,"/demo"},{1,1}} 
Stack: [{my_app,out, 
      [{arg,#Port<0.2721>, 
       {{127,0,0,1},63720}, 
       {headers,"keep-alive", 
        "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 
        "0.0.0.0:8888",undefined,undefined,undefined,undefined, 
        undefined,undefined,undefined, 
        "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:40.0) Gecko/20100101 Firefox/40.0", 
        undefined,[],undefined,undefined,undefined,undefined, 
        undefined,undefined,undefined,undefined, 
        [{http_header,0,"Dnt",undefined,"1"}, 
         {http_header,10,'Accept-Encoding',undefined, 
          "gzip, deflate"}, 
         {http_header,11,'Accept-Language',undefined,"null"}]}, 
       {http_request,'GET',{abs_path,"/demo"},{1,1}}, 
       {http_request,'GET',{abs_path,"/demo"},{1,1}}, 
       undefined,"/demo",undefined,undefined, 
       "/Users/someuser/yawstest","/", 
       "/Users/someuser/yawstest/demo",undefined,undefined, 
       <0.63.0>,[],"/","/",undefined}], 
      []}, 
     {yaws_server,deliver_dyn_part,8, 
      [{file,"yaws_server.erl"},{line,2818}]}, 
     {yaws_server,aloop,4,[{file,"yaws_server.erl"},{line,1232}]}, 
     {yaws_server,acceptor0,2,[{file,"yaws_server.erl"},{line,1068}]}, 
     {proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,239}]}] 
+0

Прочтите описание тегов перед добавлением! – Olaf

ответ

4

Трассировка стека показывает, что ваша my_app:out/1 функция вызывался, но вы получать undef исключение. Это происходит потому, что среда выполнения не может найти функцию my_app:out/1, что означает, что она не может найти модуль или модуль, но не экспортирует функцию out/1. Например, я смог продублировать ошибку, используя код примера, не предоставив модуль my_app.

Во-первых, убедитесь, что ваш файл my_app.erl экспортирует функцию out/1. Вот тривиальный, что просто возвращает ошибку 405 для всех запросов:

-module(my_app). 
-export([out/1]). 

out(_Arg) -> 
    {status, 405}. 

Скомпилировать файл my_app.erl и поместить файл скомпилирован my_app.beam либо в пути загрузки уже известны выполнения Erlang, или в каталоге, вы добавляете путь загрузки. В вашем коде появляется вы пытаетесь последний подход, так как вы специально добавления ebin_dir с этой Yaws глобальной директивы конфигурации:

GconfList = [{ebin_dir, ["/Users/someuser/yawsembedded/ebin"]}], 

Вы должны проверить, что каталог /Users/someuser/yawsembedded/ebin существует, и что скомпилированный my_app.beam файл находится там.