GenServer从数据库[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

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

最新更新