当使用yaws_api特定代码时,雅司"进程死亡"

S-K*_*-K' 0 erlang yaws

我有一个小的yaws appmod测试:

-module(webservice).
-include("../include/yaws_api.hrl").
-compile(export_all).

http(parse_query,Arg) ->
    yaws_api:parse_query(Arg);

out(Arg) -> 
    {html, [http(parse_query,Arg)]}.
Run Code Online (Sandbox Code Playgroud)

当yaws_api:parse_query函数运行时,我从yaws交互模式获得以下ERROR REPORT:

Yaws process died: {function_clause,
                   [{yaws_server,binary_size,
                        [0,{"i",undefined}],
                        [{file,"yaws_server.erl"},{line,3015}]},
                    {yaws_server,binary_size,2,
                        [{file,"yaws_server.erl"},{line,3018}]},
                    {yaws_server,binary_size,2,
                        [{file,"yaws_server.erl"},{line,3018}]},
                    {yaws_server,deflate_accumulated,4,
                        [{file,"yaws_server.erl"},{line,3712}]},
                    {yaws_server,deliver_accumulated,4,
                        [{file,"yaws_server.erl"},{line,3666}]},
                    {yaws_server,finish_up_dyn_file,2,
                        [{file,"yaws_server.erl"},{line,2745}]},
                    {yaws_server,aloop,4,
                        [{file,"yaws_server.erl"},{line,1175}]},
                    {yaws_server,acceptor0,2,
                        [{file,"yaws_server.erl"},{line,1016}]}]}
Run Code Online (Sandbox Code Playgroud)

appmod在config中设置:

<server localhost>
    port = 8080
    listen = 127.0.0.1
    #docroot = /usr/share/yaws
    docroot = /usr/lib/yaws/www
    appmods = </,webservice>
    # dir_listings = true
</server>
Run Code Online (Sandbox Code Playgroud)

Ste*_*ski 8

虽然您没有显示它,但看起来您尝试访问的URL有一个查询字符串,其中至少有一个名为变量的变量i,如下所示:

http://example.com/foo?i=10
Run Code Online (Sandbox Code Playgroud)

对于该URL,yaws_api:parse_query/1将返回[{"i","10"}],然后您尝试使用该{html, iolist()}构造将其作为HTML返回到Yaws .不幸的是,[{"i","10"}]不是iolist,string或binary,所以Yaws失败了.

您可以通过[{"i","10"}]使用yaws_api:f/2调用转换为字符串来解决此问题,如下所示:

out(Arg) ->
    {html, yaws_api:f("~p", [http(parse_query,Arg)])}.
Run Code Online (Sandbox Code Playgroud)

或使用标准io_lib:format/2电话:

out(Arg) ->
    {html, io_lib:format("~p", [http(parse_query,Arg)])}.
Run Code Online (Sandbox Code Playgroud)

yaws_api:f/2函数只是一个包装器io_lib:format/2.