调试 Erlang Webmachine 资源函数

标签 debugging erlang webmachine

我正在尝试学习如何编写 Erlang Webmachine 资源。一个资源引发错误,但我无法追踪到它。崩溃报告中的错误消息没有提供足够的信息。

有没有办法在 Erlang shell 中测试这些功能?

资源中的大多数函数都需要请求和上下文参数。但是我不知道如何在浏览器中模拟这些参数。

示例代码如下。

谢谢,

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},

最佳答案

这个答案有很多层次,具体取决于您想要看到的内容以及您想要进入的兔子洞有多深。


让我们从简单的事情开始:

你得到的错误告诉我,对 static_resource:resource_exists/2 的调用导致对 filename:join/1 的调用失败,因为它被传递 [] 作为它的参数。这应该可以帮助您找到问题所在。

推荐阅读:errors-and-exceptions


在任何语言中追踪错误的粗略方法就是在关键位置添加打印语句。在这种情况下,您可以使用 io:format/2erlang: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)

如果您想深入了解如何调试 webmachine,可以阅读 this .通过上述内容您可以走得更远,但如果您需要查看决策图,进行完整跟踪会很有帮助。

关于调试 Erlang Webmachine 资源函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6944204/

相关文章:

erlang - 如何在不启动每个节点的依赖的情况下启动分布式 Erlang 应用程序?

Erlang:有没有办法从我的模块中导出其他模块的导出?

https - 带有http和https的Webmachine?

debugging - 如何调试Azure Web App内存泄漏?

debugging - 从引导的 Firefox4 扩展调试打印

php - 在 codeigniter 中调试路由?

erlang - 选择 Erlang Web 服务器

debugging - Xcode 的 'po' 无法识别我想要研究的变量。为什么?

erlang - 从命令行启动erlang应用程序

mysql - 用于 ejabberd 的 Erlang MySQL 库