首页 > 解决方案 > Access.get/3 中没有匹配的函数子句

问题描述

在空闲时间我正在学习 elixir,现在我正在尝试开发简单的 Elixir API。一切正常,除了当我尝试使用 Postman/curl 插入新值时。当我尝试使用此类数据时:

{
    "tree": "nil",
    "value": "5"
}

我得到这个错误:(FunctionClauseError) no function clause matching in Access.get/3

这是我的端点中的 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

如果这还不够,我将提供更多代码。感谢您的任何建议和帮助。

标签: elixirplug

解决方案


我认为你的代码有问题。我已经整理了你的代码:

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) # What is this line? What is the output?
        
      _ ->
        {400, missing_insert()}
    end

  send_resp(conn, status, body)
end

每个子句/函数的最后一行是返回值。所以你的第一个case子句返回BstInsertion.insert(tree, value). 这是你所期望的吗?从上一行来看,我可以说不是。


推荐阅读