如何正确创建插件模块?

时间:2016-10-26 06:54:55

标签: elixir phoenix-framework

我可以通过http://www.phoenixframework.org/docs/understanding-plug#section-module-plugs

创建自己的插件模块

说,我想检查一个请求中是否有一个标头及其值,如果它们是正确的,则继续进一步,如果没有,则终止当前请求并返回某个状态和消息,可能是在json中。

但是,不允许从插件模块返回html或json或其他任何内容,它只能修改传递给控制器​​的连接结构。

那我该怎么办呢?我应该在其中添加某个键,然后在控制器中检查它吗?但它会产生很多重复,不是吗?

   # plug module
   def call(conn, default) do
     if condition1
       assign(conn, :my_key, %{status: :ok, msg: "okkkeey"})
     else
       assign(conn, :my_key, %{status: :error, msg: "we have problems")
   end

   # my_controller
   def action1(conn)
     # check for :my_key and its status

1 个答案:

答案 0 :(得分:4)

只要您最后halt/1,就可以从插件返回HTML或JSON。

   # plug module
   def call(conn, default) do
     if condition1
       assign(conn, :my_key, %{status: :ok, msg: "okkkeey"})
     else
       conn
       |> send_resp(400, "Something wrong")
       |> halt()
   end

如果要返回JSON,可以使用Phoenix.Controller.json/2,但是由于默认情况下未导入该函数,因此需要使用完整的函数名称。

   def call(conn, default) do
     if condition1
       assign(conn, :my_key, %{status: :ok, msg: "okkkeey"})
     else
       conn
       |> put_status(400)
       |> Phoenix.Controller.json(%{error: "We have problems"})
       |> halt()
   end