首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将选项从Plug.Router转发到另一个Plug.Router

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

Stack Overflow用户
提问于 2018-11-21 14:58:55
回答 1查看 473关注 0票数 0

背景

我有一个接收一些选项的Plug.Router应用程序。我需要通过forward将这些选项传递给其他插件,但我不知道该如何做。

代码

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

代码语言:javascript
复制
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,但是我不能访问它们。

首先,我想到了下面的代码片段:

代码语言:javascript
复制
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实现我的目标呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-21 15:30:31

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

类似于:

代码语言:javascript
复制
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上的选项。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53414813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档