插件,使用在初始化时通过 Plug.Router 语法传递的选项
Plug, use option passed at init with Plug.Router syntax
我用的是Plug,想了解一下
我的代码如下:
defmodule Numerino.Plug do
use Plug.Router
use Plug.Debugger
plug :put_resp_content_type, "application/json"
plug :match
plug :dispatch
def init options do
IO.inspect options
options
end
get "/" do
conn
|> IO.inspect
|> send_resp(201, "world")
end
match _ do
send_resp(conn, 404, "Not found.")
end
end
在 get 中,我需要使用作为参数传递的 option
。
如何访问保持相同 Plug.Router 语法的选项?
你没有说明你为什么要这样做,所以我只能给出一个笼统的答案。如果您有特定的用例,那么可能会有更好的解决方案。
您可以通过向路由器添加一个额外的插件来实现此目的,该插件将 opts 存储在 conn 的私有存储中:
plug :opts_to_private
defp opts_to_private(conn, opts) do
put_private(conn, :my_app_opts, opts)
end
这将在您的路线中通过 conn.private.my_app_opts
:
访问
get "/" do
conn.private.my_app_opts
|> IO.inspect
conn
|> send_resp(201, "world")
end
调度函数是defoverridable/1所以你也可以通过覆盖函数来做同样的事情:
defp dispatch(conn, opts) do
conn = put_private(conn, :my_app_opts, opts)
super(conn, opts)
end
但是我发现定义了一个新函数,例如 opts_to_private
cleaner。
您只需覆盖调用回调:
def call(conn, opts) do
put_private(conn, :opts, opts)
|> super(opts)
end
我用的是Plug,想了解一下
我的代码如下:
defmodule Numerino.Plug do
use Plug.Router
use Plug.Debugger
plug :put_resp_content_type, "application/json"
plug :match
plug :dispatch
def init options do
IO.inspect options
options
end
get "/" do
conn
|> IO.inspect
|> send_resp(201, "world")
end
match _ do
send_resp(conn, 404, "Not found.")
end
end
在 get 中,我需要使用作为参数传递的 option
。
如何访问保持相同 Plug.Router 语法的选项?
你没有说明你为什么要这样做,所以我只能给出一个笼统的答案。如果您有特定的用例,那么可能会有更好的解决方案。
您可以通过向路由器添加一个额外的插件来实现此目的,该插件将 opts 存储在 conn 的私有存储中:
plug :opts_to_private
defp opts_to_private(conn, opts) do
put_private(conn, :my_app_opts, opts)
end
这将在您的路线中通过 conn.private.my_app_opts
:
get "/" do
conn.private.my_app_opts
|> IO.inspect
conn
|> send_resp(201, "world")
end
调度函数是defoverridable/1所以你也可以通过覆盖函数来做同样的事情:
defp dispatch(conn, opts) do
conn = put_private(conn, :my_app_opts, opts)
super(conn, opts)
end
但是我发现定义了一个新函数,例如 opts_to_private
cleaner。
您只需覆盖调用回调:
def call(conn, opts) do
put_private(conn, :opts, opts)
|> super(opts)
end