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

时间:2020-01-23 16:06:42

标签: 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的新手,感谢您的帮助。谢谢

1 个答案:

答案 0 :(得分:1)

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

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

编辑:经过进一步检查,您似乎有多个错误,因此我将发布有关您的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
相关问题