我可以通过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
答案 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