Elixir API出现no function clause matching in Keyword.get/3错误求助排查
问题分析与解决方案
错误根源
从错误日志看,核心问题是Keyword.get/3接收到了错误类型的参数:
** (FunctionClauseError) no function clause matching in Keyword.get/3 (elixir 1.14.2) lib/keyword.ex:388: Keyword.get(:default, :key, nil)
Keyword.get/3要求第一个参数必须是Keyword列表,但这里传入的是原子:default。追踪调用链可知,问题出在load_resource.ex中调用Guardian.Plug系列函数时的参数传递错误。
Guardian的current_resource/2、claims/2、set_current_resource/3等函数,第二个参数需要是Keyword选项列表(而非单独的原子key)。你直接传入了key原子,导致Guardian内部将其当作opts处理,进而触发类型错误。
修复代码
修改load_resource.ex第30-42行的Guardian调用,将key作为选项传入:
case Guardian.Plug.current_resource(conn, key: key) do nil -> case Guardian.Plug.claims(conn, key: key) do {:ok, claims} -> claims |> load_resource(opts) |> put_current_resource(conn, key) {:error, _} -> Guardian.Plug.set_current_resource(conn, nil, key: key) end _ -> conn end
如果你的key变量值就是默认的:default,也可以简化为省略选项参数(Guardian默认使用:default作为key):
case Guardian.Plug.current_resource(conn) do nil -> case Guardian.Plug.claims(conn) do {:ok, claims} -> claims |> load_resource(opts) |> put_current_resource(conn, :default) {:error, _} -> Guardian.Plug.set_current_resource(conn, nil) end _ -> conn end
调试建议
- 在
load_resource.ex中添加IO.inspect(key),确认key变量的实际值是否符合预期(应为原子类型,如:default) - 检查路由中
LoadResourceplug的初始化代码,确保传入的key参数正确传递到该模块 - 临时调高日志级别(在
config/config.exs中设置config :logger, level: :debug),查看更详细的请求处理流程
内容的提问来源于stack exchange,提问作者tmariaz
相关产品推荐
相关产品推荐

