Отладка функций ресурса Erlang Webmachine
Я пытаюсь научиться писать ресурсы Erlang Webmachine. Один ресурс выдает ошибку, но я не могу отследить ее. Сообщение об ошибке в отчете о сбое не предоставляет достаточно информации.
Есть ли способ проверить эти функции в оболочке Erlang?
Большинство функций в ресурсе требуют параметров запроса и контекста. Но я не знаю, как смоделировать эти параметры в браузере.
Пример кода ниже.
Спасибо,
LRP
Пример кода:
Я думаю конкретно о таких функциях, как:
content_types_provided(RD, Ctx) ->
Path = wrq:disp_path(RD),
{[{webmachine_util:guess_mime(Path), generate_body}],
RD, Ctx}.
Но моя текущая ошибка в функции init.
Это работает...
Правило отправки:
{["blip"], zzz_resource, []}.
В этом:
init([]) -> {ok, undefined}.
to_html(ReqData, State) ->
% {"<html><bodoy>Hello, new world</body></html>", ReqData, State}.
{test:test(), ReqData, State}.
Но это выдает ошибку:
Отправка:
{["static"], static_resource,[]}.
В этом:
init(_) ->
DocRoot =
case init:get_argument(doc_root) of
{ok, [[DR]]} -> DR;
error -> "doc_root path error"
end,
{ok, #ctx{docroot=DocRoot}}.
=ERROR REPORT==== 4-Aug-2011::10:54:56 ===
webmachine error: path="/static"
{error,function_clause,
[{filename,join,[[]]},
{static_resource,resource_exists,2},
2 ответа
В этом ответе много слоев, в зависимости от того, что вы хотите увидеть и как глубоко в кроличью нору вы хотите пройти.
Давайте начнем с простых вещей:
Ошибка, которую вы получаете, говорит мне, что вызов static_resource:resource_exists/2
привело к звонку filename:join/1
который потерпел неудачу, потому что он был принят []
в качестве аргумента. Это должно помочь вам отследить проблему.
Рекомендуемое чтение: ошибки и исключения
Грубый способ отследить ошибки на любом языке - просто добавить операторы печати в стратегические лекции. В этом случае вы можете использовать io:format/2
или же erlang:display/1
чтобы отобразить все, что вы хотите на консоли. Например:
...
erlang:display("I'm inside resource_exists!"),
StuffToJoin = ["foo", "bar"],
erlang:display(StuffToJoin),
filename:join(StuffToJoin),
...
Просто перезагрузите страницу, чтобы увидеть значение, напечатанное на консоли (при условии, что соответствующая функция была вызвана как часть перезагрузки).
Если вы хотите вручную протестировать ресурс (как в модульном тесте), вы можете сделать что-то вроде следующего:
Headers = [{"Host", "mydomain.com"}, {"user-agent", "Firefox"}],
Context = [],
Path = "/static",
ReqData = wrq:create('GET', {1,1}, Path, mochiweb_headers:from_list(Headers)),
static_resource:resource_exists(ReqData, Context)
Если вы хотите глубже взглянуть на то, как отлаживать веб-машину, вы можете прочитать это. Вы можете довольно далеко продвинуться выше, но полная трассировка может быть полезна, если вам нужно увидеть график решений.
В дополнение к различным методам, предложенным Дэвидом, вы также должны научиться использовать модуль dbg. Это невероятно мощный и позволяет отслеживать функции и модули в режиме реального времени.
В качестве примера, для вашего конкретного случая, предположим, что вы хотите отследить все функции в модуле static_resource:
.. 1> dbg: tracer (). {Хорошо,} 2> dbg:p(все,[c]). {ОК,[{совпадают,nonode@nohost,25}]} 3> dbg:tp({static_resource, '_', '_'}, []). {ОК,[{совпадают,nonode@nohost,5}]} ...
после чего вы будете видеть распечатку (включая все параметры функции в вызове функции) всякий раз, когда модуль static_resource вызывается где-либо.
Полное описание dbg
выходит за рамки этого небольшого пространства ответов. Я рекомендую книгу о программировании Эрланга О'риелли. У Chaper 17 есть действительно классное написание и учебник о том, как его использовать dbg
и его различные следы.