GenServer 从数据库 [Elixir] 中搜索键值对

GenServer search key-value pairs from database [Elixir]

我正在尝试搜索存储在我的 genserver 中的键值对。我认为我将地图传递到我的 handle_call 函数的语法有问题。

这是我的搜索函数和句柄回调函数:

def search(bucket, key_value_list) do
  Enum.map(key_value_list, fn {key, value} ->
    GenServer.call(bucket, {:search, key_value_list})
  end)
end 

def handle_call({:search, key_value_list}, from, state) do
  {:noreply, Map.get(key_value_list)}
end

错误信息:

{:ok, orders} = Server.Database.search(database, [{"order_details", "000147760"}])
16:52:07.960 [error] GenServer #PID<0.320.0> terminating
** (UndefinedFunctionError) function Map.get/1 is undefined or private
    (elixir) Map.get([{"order_details", "000147760"}])
    (tuto_kbrw_stack) lib/server/database.ex:45: Server.Database.handle_call/3
    (stdlib) gen_server.erl:661: :gen_server.try_handle_call/4
    (stdlib) gen_server.erl:690: :gen_server.handle_msg/6
    (stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3

我是 Elixir 的新手,非常感谢您的帮助。谢谢

如果您阅读 Map.get/3 的文档,您会注意到它需要 3 个参数。假设您正确地将状态存储为地图,那么您需要更改:

def handle_call({:search, key_value_list}, from, state) do
  {:reply, Map.get(state, key_value_list), state}
end

编辑:经进一步检查,您似乎有多个错误,所以我将 post 了解您的 genserver 的外观:

defmodule GenserverExample do
  use GenServer

  def init(map) when is_map(map) do
    {:ok, map}
  end

  def search(bucket, search_list) when is_list(search_list) do
    GenServer.call(bucket, {:search, search_list})
  end

  def handle_call({:search, search_list}, _from, state) do
    results = Enum.map(search_list, fn search_element -> Map.get(state, search_element) end)
    {:reply, results, state}
  end
end