我每次都拨打一些插头。我想创建一个单独的插件,为我调用所有这些。我该怎么做呢?
这是我目前试图做的事情:
defmodule MyApp.SpecialPlug do
import Plug.Conn
def init(default), do: default
def call(conn, default) do
plug SimplePlug1
plug SimplePlug2, args: :something
end
end
但它会抛出CompileError
,说:undefined function plug
答案 0 :(得分:9)
您只需使用Plug.Builder
:
defmodule MyApp.SpecialPlug do
use Plug.Builder
plug SimplePlug1
plug SimplePlug2, args: :something
end
这会自动定义init
和call
,这会将conn
依次传递给SimplePlug1
,然后传递SimplePlug2
。
如果您真的想手动调用插件,可以执行以下操作:
defmodule MyApp.SpecialPlug do
def init({opts1, opts2}) do
{SimplePlug1.init(opts1), SimplePlug2.init(opts2)}
end
def call(conn, {opts1, opts2}) do
case SimplePlug1.call(conn, opts1) do
%Plug.Conn{halted: true} = conn -> conn
conn -> SimplePlug2.call(conn, opts2)
end
end
end
请注意,您必须自己添加halted: true
自己的检查(除非您因某种原因想忽略暂停)。 Plug.Builder
会自动为您做同样的事情
获得相当于:
plug SimplePlug1
plug SimplePlug2, args: :something
你现在可以做到:
plug MyApp.SpecialPlug, {[], [args: :something]}