代码之家  ›  专栏  ›  技术社区  ›  Flame_Phoenix

从一个插头转发选项。路由器到另一个插头。路由器

  •  0
  • Flame_Phoenix  · 技术社区  · 6 年前

    背景

    我有一个 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
    

    正如你可能猜到的,这行不通。我想要我的 向前地 调用以访问 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
    

    但这不起作用,因为我不能 向前地 里面 call .

    那么我如何实现我的目标 向前地 ?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Marcos Tapajós    6 年前

    有一个选项可以添加一个顶级插头,用于存储父选项 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
    

    然后你可以在conn上获取选项 Example.Route.Check.call/2 .

    推荐文章