[erlang] 让你欲哭无泪的坑盘点

前言

在使用erlang的过程中, 有些时候看语法就产生了想当然的想法, 然后处理全都出错, 一步步排查下来, 错误竟然是...

正文

  1. case 和 #{} 的坑
case #{<<"a">> => <<"apple">> of
   #{} -> true;  %% √
   _ -> false
end.

以常理度之, 上述代码返回应该是 false, 然而erlang会优先进行一次格式校验(似乎仅对Map格式生效), 当 case 的数据类型是 Map 的时候, 上述代码就会返回 true.

  1. cowboy 读取body
{ok, Body, _Req} = cowboy_req:read_body(Req),   %%正常body
{ok, Body, _Req} = cowboy_req:read_body(Req)    %% 空的

当read请求多次的时候, 从第二次开始, 读取的body就是的. 读取源码就会发现, Req本身是不包含 body 的, 但是包含一个 Pid, 读取的本质是向这个 Pid 发起读取 body 的请求, 听起来多次读取的结果应该是一样的, 但是cowboy实现的时候考虑的应该是另一种情况: 当请求体过长, 无法一次打印的情况下, 用流的方法进行传输, 传输一点, pid的缓存区删除一点, 这样可以避免重复发送. 当发送完成, 缓存区就没有数据了, 后续读取自然就只能读取到空了.

待续...

你可能感兴趣的:([erlang] 让你欲哭无泪的坑盘点)