将选项从一个插件路由器转发到另一个插件转发器



背景

我有一个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中获取连接器上的选项。

相关内容

  • 没有找到相关文章