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
我正在尝试搜索存储在我的 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