使用Plug.Router语法在init上传递的Plug,use选项

Sis*_*cia 5 elixir phoenix-framework

我正在使用Plug,我想了解.

我的代码看起来像:

defmodule Numerino.Plug do
  use Plug.Router
  use Plug.Debugger

  plug :put_resp_content_type, "application/json"
  plug :match
  plug :dispatch

  def init options do
    IO.inspect options
    options
  end

  get "/" do
    conn
    |> IO.inspect
    |> send_resp(201, "world")
  end

  match _ do
    send_resp(conn, 404, "Not found.")
  end

end
Run Code Online (Sandbox Code Playgroud)

在get中我需要使用option传递的参数.

如何访问保持相同Plug.Router语法的选项?

Gaz*_*ler 4

你没有具体说明为什么要这样做,所以我只能给出一个笼统的答案。如果您有特定的用例,那么可能会有更好的解决方案。


您可以通过向路由器添加一个额外的插头来实现此目的,该插头将选项存储在 conn 的私有存储中:

plug :opts_to_private

defp opts_to_private(conn, opts) do
  put_private(conn, :my_app_opts, opts)
end
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过以下方式在您的路线中访问此内容conn.private.my_app_opts

get "/" do
  conn.private.my_app_opts
  |> IO.inspect

  conn
  |> send_resp(201, "world")
end
Run Code Online (Sandbox Code Playgroud)

调度函数是defoverridable/1因此您也可以通过重写该函数来执行相同的操作:

defp dispatch(conn, opts) do
  conn = put_private(conn, :my_app_opts, opts)
  super(conn, opts)
end
Run Code Online (Sandbox Code Playgroud)

然而,我发现定义了一个新功能,例如opts_to_private清洁器。

  • 这在当前的插件中不再起作用。我在“opts_to_private”中得到“[]”作为选项(在 init 中我得到了正确的选项)。 (2认同)