Я взял ваш код для модуля BoardState
почти дословно, за исключением того, что я изменил start_link
, чтобы он лучше работал с Supervisor
API:
defmodule BoardState do
...
def start_link(_) do
Agent.start_link(fn -> %{} end, name: __MODULE__)
end
...
end
Я добавил BoardState
к своему дерево наблюдения:
defmodule Test.Application do
...
def start(_type, _args) do
children = [
TestWeb.Endpoint,
# Notice I'm putting BoardState under a supervisor here.
# In your case, you linked it to the process performing the startup,
# which is a different thing.
BoardState
]
opts = [strategy: :one_for_one, name: Test.Supervisor]
Supervisor.start_link(children, opts)
end
...
end
Затем я добавил простой контроллер для его проверки:
defmodule TestWeb.PageController do
use TestWeb, :controller
def put(conn, params) do
BoardState.add(params["key"], params["value"])
Plug.Conn.resp(conn, 200, "OK\n")
end
def get(conn, params) do
value = BoardState.get(params["key"])
Plug.Conn.resp(conn, 200, "#{value}\n")
end
end
И пару маршрутов для этого:
defmodule TestWeb.Router do
...
scope "/", TestWeb do
...
get "/put/:key/:value", PageController, :put
get "/get/:key", PageController, :get
end
end
С этим похоже, что он работает, как и ожидалось, помня данные, отправленные на него:
rindr:test yapee$ curl localhost:4000/put/hello/world
OK
rindr:test yapee$ curl localhost:4000/get/hello
world
Я надеюсь, что вы можете отладить свою проблему с помощью этих фрагментов. Я думаю, что ваша проблема может быть связана с тем, что вы на самом деле не ставите свой BoardState
под надзор, а случайным образом start_linking
вместо него.