В Access нет совпадения предложений функций.get/3

#elixir #plug

Вопрос:

В свободное время я изучаю эликсир, и сейчас я пытаюсь разработать простой API Эликсира. Все работает нормально, кроме того, когда я пытаюсь вставить новые значения с помощью Postman/curl. Когда я пытаюсь сделать это с такими данными:

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

Я получаю эту ошибку: (FunctionClauseError) no function clause matching in Access.get/3 .

Вот мой код для публикации в моей конечной точке.

 post "/insert" do  IO.inspect(conn.body_params)  {status, body} =  case conn.body_params do  %{"tree" =gt; tree, "value" =gt; value} -gt; {200, process_insert(tree, value)}  BstInsertion.insert(tree, value)  _ -gt; {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  

Если этого недостаточно, я предоставлю больше кода. Спасибо вам за любые советы и помощь.

Комментарии:

1. Ошибка, которую вы видите, заключается в том, что вы вызываете Access.get/3 функцию с неправильными аргументами. Это функция, которую вы написали? Я не вижу никакого кода, который вызывал бы эту функцию.

2. @ChristopheDeTroyer Не является Access.get/3 встроенной функцией эликсира? Я нигде не писал функцию Access.get/3.

3. Я думаю, что они имели в виду, что код, который вы нам показываете, не включает в себя никаких вызовов Access.get/3 . Возможно, это входит в ваши process_insert/2 функции?

4. @BrettBeatty Пожалуйста, проверьте обновленный вопрос. Я прикрепил соответствующий код для этой функции.

5. Это приведет к другому предложению вашей insert/2 функции , потому tree что имеет значение "nil" , а не nil . Возможно, в своем запросе вы захотите передать "tree": null свой JSON, если я понимаю ваши намерения. Ваше следующее предложение может ожидать существования tree , когда это просто строка «ноль». В следующий раз вы столкнетесь с проблемами , когда {status, body} не будет возвращено из первого предложения в вашем case : вместо этого он возвращает результат insert/2 , который выглядит как карта, представляющая ваше дерево.

Ответ №1:

Я думаю, что у вас проблема с вашим кодом. Я немного привел в порядок ваш код:

 post "/insert" do  IO.inspect(conn.body_params)  {status, body} =  case conn.body_params do  %{"tree" =gt; tree, "value" =gt; value} -gt;  {200, process_insert(tree, value)}  BstInsertion.insert(tree, value) # What is this line? What is the output?    _ -gt;  {400, missing_insert()}  end   send_resp(conn, status, body) end  

Последняя строка в каждом предложении/функции-это возвращаемое значение. Таким образом, ваше первое case предложение возвращает значение BstInsertion.insert(tree, value) . Это то, чего ты ожидал? Из предыдущей строки я могу сказать, что это не так.