背景
我有一个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
来实现我的目标呢?
有一个选项添加了一个顶级插件,该插件将在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
中获取连接器上的选项。