#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)
. Это то, чего ты ожидал? Из предыдущей строки я могу сказать, что это не так.