2015-08-31 1 views
2

Très bien, qu'est-ce que je fais mal ici. J'essaye l'exemple simple de YAWs embarqués de http://yaws.hyber.org/embed.yaws mais avec un appmod. J'ai ajouté le fichier my_app.erl et l'ai compilé. Cela fonctionne si ce n'est pas dans les YAW intégrés, donc je pense qu'il est spécifique à l'embarqué.YAWs intégré avec appmod ne fonctionne pas pour moi

-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()}. 

Obtenir cette erreur:

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

Lisez les descriptions des étiquettes avant d'ajouter! – Olaf

Répondre

4

La trace de la pile montre que votre fonction est my_app:out/1 obtenir appelé, mais vous obtenez une exception undef. Cela se produit car le moteur d'exécution ne trouve pas la fonction my_app:out/1, ce qui signifie qu'il ne trouve pas le module ou que le module existe mais n'exporte pas une fonction out/1. Par exemple, j'ai été en mesure de dupliquer l'erreur en utilisant l'exemple de code en ne fournissant pas un module my_app. Commencez par vérifier que votre fichier my_app.erl exporte une fonction out/1. Voici un trivial qui vient renvoie une erreur 405 pour toutes les demandes:

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

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

compilez votre fichier my_app.erl et placez le fichier compilé my_app.beam soit dans un chemin de charge déjà connue du Erlang, ou dans un répertoire que vous ajoutez à le chemin de chargement. Dans votre code, il semble que vous essayez cette dernière approche, puisque vous spécifiquement l'ajout d'un ebin_dir avec cette directive de configuration globale pian:

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

Vous devez vérifier que le répertoire existe /Users/someuser/yawsembedded/ebin, et que le compilez my_app.beam le fichier est situé là.