如何在运行时调用由Plug.Router宏定义的路由?

时间:2019-02-19 01:19:51

标签: elixir plug

我可以手动构建一个conn然后像函数一样调用它们吗?如果您不明白“它们”的含义,请查看下面的代码。

例如,定义路线/ping

get "/ping" do
  send_resp(conn, 200, "pong")
end

我知道可以使用conn中的use Plug.Test函数来完成此操作,但是它基于HTTP客户端,而不是运行时函数调用,效率太低。

1 个答案:

答案 0 :(得分:1)

正如您所说,标准方法是使用Plug.Test.conn/3来构建一个%Plug.Conn{}结构,该结构将导致该路由被调用。

所有插头都具有call/2函数,该函数在运行时可用。

示例:

conn = Plug.Test.conn(:get, "/ping", "")
conn = YourModule.Router.call(conn, [])

get宏在编译时是compiled到私有的match/3函数,该函数本身由call/2函数调用,还需要{{1} }结构。因此,除非您从路由器模块内部调用conn,否则必须使用call/2回调进行运行时测试。 match/3不使用HTTP客户端-只是生成一个结构。我认为您对效率低下的担忧是没有根据的。