将选项从Plug.Router转发到另一个Plug.Router

时间:2018-11-21 14:58:55

标签: elixir plug

背景

我有一个Plug.Router应用程序,该应用程序有一些选择。我需要通过forward将这些选项传递给其他插头,但我不知道该怎么做。

代码

这是主要路由器。它接收请求并决定将请求转发到何处。

defmodule MyApp.Web.Router do
  use Plug.Router

  plug(:match)
  plug(:dispatch)

  #Here I check that I get options! 
  def init(father_opts), do: IO.puts("#{__MODULE__} => #{inspect father_opts}")

  forward "/api/v1", to: MyApp.Web.Route.API.V1, init_opts: father_opts??
end

您可能会猜到,这是行不通的。我希望我的forward呼叫访问此路由器正在接收的father_opts,但我无法访问它们。

起初,我会讲以下代码片段:

def init(opts), do: opts

def call(conn, father_opts) do
  forward "/api/v1", to: MyApp.Web.Route.API.V1, init_opts: father_opts
end

但这无法正常工作,因为我无法在forward内放置call

那么我如何使用forward来实现我的目标?

1 个答案:

答案 0 :(得分:0)

有一个添加顶级插件的选项,它将在private上存储父选项,您可以在子call上获取父选项。

类似的东西:

defmodule Example.Router do
  def init(opts), do: opts
  def call(conn, options) do
    Example.RouterMatch.call(Plug.Conn.put_private(conn, :father_options, options), Example.RouterMatch.init(options))
  end
end

defmodule Example.RouterMatch do
  use Plug.Router

  plug :match
  plug :dispatch

  forward "/check", to: Example.Route.Check
  forward "/dispatch", to: Example.Plug.Dispatch
end

然后,您可以在Example.Route.Check.call/2中的conn上获取选项。