You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Elixir开发API时POST插入请求触发Access.get/3无匹配函数子句报错

问题排查与解决方案

1. 修复case语句语法错误

你当前POST接口的case分支写法存在逻辑错误,错误位置如下:

case conn.body_params do
  %{"tree" => tree, "value" => value} -> {200, process_insert(tree, value)}
  BstInsertion.insert(tree, value) # 该行不属于任何分支的执行逻辑,位置完全错误
  _ -> {400, missing_insert()}
end

你预期的逻辑应该是拿到tree和value参数后先执行插入再返回结果,正确写法如下:

case conn.body_params do
  %{"tree" => tree, "value" => value} -> 
    inserted_tree = BstInsertion.insert(tree, value)
    {200, process_insert(inserted_tree, value)}
  _ -> {400, missing_insert()}
end

原错误写法会把BstInsertion.insert(tree, value)当成第二个case分支的匹配模式,模式匹配过程中会尝试对传入参数做Access读取,直接触发你遇到的Access.get/3匹配报错。

2. 修复参数类型不匹配问题

你请求中传入的"tree": "nil"是字符串类型的"nil",但insert/2函数第一个参数匹配的是Elixir的原子类型nil;同时传入的value是字符串"5",和预期的数字类型也不匹配。
你需要在拿到参数后做类型转换:

%{"tree" => tree_str, "value" => value_str} -> 
  # 转换tree参数:字符串"nil"转原子nil,后续如果传序列化后的树结构可以用Jason等库反序列化
  tree = if tree_str == "nil", do: nil, else: Jason.decode!(tree_str)
  # 转换value为整数
  value = String.to_integer(value_str)
  inserted_tree = BstInsertion.insert(tree, value)
  {200, process_insert(inserted_tree, value)}

3. 补充insert函数的多分支匹配

当前你只写了insert(nil, value)一个分支,当tree不是nil的时候会触发函数匹配错误,需要补充非空树的插入逻辑:

def insert(%{value: node_val, ltree: l, rtree: r}, value) when value < node_val do
  %{value: node_val, ltree: insert(l, value), rtree: r}
end

def insert(%{value: node_val, ltree: l, rtree: r}, value) when value >= node_val do
  %{value: node_val, ltree: l, rtree: insert(r, value)}
end

内容的提问来源于stack exchange,提问作者Kapeusz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 02:57:02