【发布时间】:2021-10-27 17:55:45
【问题描述】:
在我的空闲时间我正在学习 elixir,现在我正在尝试开发简单的 Elixir API。一切正常,除了当我尝试使用 Postman/curl 插入新值时。当我尝试使用此类数据时:
{
"tree": "nil",
"value": "5"
}
我收到此错误:(FunctionClauseError) no function clause matching in Access.get/3。
这是我在 Endpoint 中的 POST 代码。
post "/insert" do
IO.inspect(conn.body_params)
{status, body} =
case conn.body_params do
%{"tree" => tree, "value" => value} -> {200, process_insert(tree, value)}
BstInsertion.insert(tree, value)
_ -> {400, missing_insert()}
end
send_resp(conn, status, body)
end
插入函数和process_insert示例:
def insert(nil, value) do
%{value: value, ltree: nil, rtree: nil}
end
defp process_insert(_tree, _value) do
Poison.encode!(%{response: "Received insert!"})
end
如果这还不够,我会提供更多代码。感谢您的任何建议和帮助。
【问题讨论】:
-
您看到的错误是因为您使用错误的参数调用
Access.get/3函数。是你写的函数吗?我没有看到任何调用该函数的代码。 -
@ChristopheDeTroyer Access.get/3 不是 Elixir 的内置函数吗?我没有在任何地方写Access.get/3函数。
-
我认为他们的观点是您向我们展示的代码不包括对
Access.get/3的任何调用。也许在你的process_insert/2函数中? -
@BrettBeatty 请检查更新的问题。我附上了这个功能的相关代码。
-
它将转到
insert/2函数的另一个子句,因为tree的值是"nil",而不是nil。如果我理解您的意图,您可能希望在您的 JSON 中传递"tree": null。当它只是字符串“nil”时,您的下一个子句可能需要一个现有的tree。接下来你会遇到问题,{status, body}不是从case的第一个子句返回的:而是返回insert/2的结果,这似乎是代表你的树的地图。