在处理请求后运行插件管道



Plugs管道是构建应用程序的一种神奇方式。不过目前我只是在请求到达控制器之前应用管道来过滤/格式化数据。有没有一种方法可以在处理完每个视图后应用管道来运行?我有一个JSONAPI,我在每个视图渲染函数上运行两个数据转换。

def render("app.json", %{app: app}) do
app
...
|> ApiHelpers.add_data_property
|> ProperCase.to_camel_case
end 

有没有一种更干净的方法来处理这个问题,或者这是我只需要在视图模块中的每个渲染函数上做的事情?

更新

正如@sabiwara所指出的,存在register_before_send回调。我已经尝试在我的用例中实现它,但回调似乎更多的是用于日志记录,而不是操纵响应。

我试过

def call(conn, _opts) do
register_before_send(conn, fn conn ->
resp(conn, conn.status, conn.resp_body |> FormatHelpers.camelize() |> ApiHelpers.add_data_property())
end)
end

conn.resp_body是一个列表,我曾尝试将其转换为地图,但仍然没有效果。

在编码JSON内容之前对其进行转换的一种方法是在配置中定义一个自定义编码器:https://hexdocs.pm/phoenix/Phoenix.Template.html#module-格式编码器

添加新文件:

defmodule MyJSONEncoder do
def encode_to_iodata!(data) do
data
|> transform_data()
|> Jason.encode_to_iodata!()
end

def transform_data(data) do
# whatever transformation you need to make
%{data: data}
end
end

config.exs:

config :phoenix, :format_encoders, json: MyJSONEncoder

不是100%确定这是最好的方式,它会影响每一个响应,但它似乎对您的用例很有效。

相关内容

  • 没有找到相关文章