首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Erlang的dets不能用open_file创建文件

Erlang的dets不能用open_file创建文件
EN

Stack Overflow用户
提问于 2016-12-16 06:58:09
回答 1查看 264关注 0票数 0

这是我第一次尝试用Erlang编写任何东西,所以这个问题可能很愚蠢。

我正在使用牛仔编写一个非常简单的HTTP服务器

代码语言:javascript
复制
db_name() -> "DB_test".

timestamp() ->
    calendar:datetime_to_gregorian_seconds(calendar:universal_time()).

sha(Str) ->
    <<X:256/big-unsigned-integer>> = crypto:hash(sha256, Str),
    lists:flatten(io_lib:format("~64.16.0b", [X])).

handle_post(Req0, State) -> 
    Link = binary_to_list(cowboy_req:header(<<"link">>, Req0)),
    dets:open_file(db_name(), []),
    dets:insert(db_name(), {hashed_url(Link), Link, timestamp()}),

    Req = cowboy_req:reply(200,
        #{<<"content-type">> => <<"text/plain">>},
        sha(Link),
        Req0),
    {ok, Req, State}.

这个想法是POST HTTP请求包含一个带有一些链接的“link”头。在收到这样的请求后,我的服务器应该将它的散列值与链接及其时间戳一起存储在dets表中。问题是没有创建"DB_test“文件。为什么?

EN

回答 1

Stack Overflow用户

发布于 2016-12-16 07:31:49

根据您的示例代码,很难说确切的原因,因为您忽略了来自两个dets:open_file/2和dets:insert/2的返回值。这两个返回值对于成功和失败情况返回不同的值;但不要抛出异常。有关详细信息,请参阅官方文档:http://erlang.org/doc/man/dets.html

最简单的解决方案是在不成功的情况下使牛仔连接处理过程崩溃。您可以通过执行以下操作来完成此操作:

代码语言:javascript
复制
 {ok, Ref} = dets:open_file(db_name(), []),
 ok = dets:insert(Ref, {hashed_url(Link), Link, timestamp()}),

在失败的情况下,当返回的值不能与语句的左侧进行模式匹配时,这将崩溃,并出现错误匹配异常,从而导致牛仔向客户端返回HTTP 500。然后,您将看到有关所记录的堆栈跟踪中实际错误的详细信息

第二个解决方案是显式地处理失败的情况,你可以使用'case‘关键字。示例如下所示:

代码语言:javascript
复制
case dets:open_file(db_name(), []) of
   {ok, Ref} ->
       do_success_things();
   {error, Reason}=E ->
       io:format("Unable to open database file: ~p~n", [E]),
       do_failure_things();
end

要进一步阅读,我强烈推荐学习一些Erlang For great good:http://learnyousomeerlang.com/的函数、错误和异常中的语法章节

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41174696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档