我试图在Elixir中设置一个非常简单的基本HTTP API。我认为使用Phoenix这样的事情是完全矫枉过正的,所以想通过使用Plug来做到这一点。我可以通过设置这样的基本路由器来实现:
defmodule Example.Router do
use Plug.Router
plug Plug.Logger
plug :match
plug :dispatch
get "/" do
data = do_something_with_conn(conn)
send_resp(conn, 200, Poison.encode!(data))
end
match _, do: send_resp(conn, 404, "Not Found")
end
但是,我无法弄清楚如何将此路由器连接到另一个插件功能。比方说,我有这个插件兼容的功能:
defmodule RandomPlug do
import Plug.Conn
def random_plug(conn, opts) do
whatever(conn)
end
end
如何将其连接到路由器?我尝试使用docs中的语法:
forward "/", to: RandomPlug.random_plug
和其他变体,但我无法编译和/或工作。例如,上面的版本抱怨没有random_plug / 0函数。
是的,我可以使用整个Plug模块(init
和call
),但我想知道如何使用函数。也许它会让我更好地理解Elixir的一些细节,并且根据文档应该是可能的。
答案 0 :(得分:1)
我刚刚阅读了Plug.Builder
的来源,但未找到在plug
中指定模块和函数名称组合的方法。它seems to be limited to either a function name or a module name(在这种情况下,它会调用module.init/2
)。但是,您可以 import
模块中的函数,然后将导入的函数视为本地函数:
defmodule Example.Router do
use Plug.Router
...
import RandomPlug
plug :random_plug
end