【问题标题】:handling pattern match exceptions in phoenix elixir处理phoenix elixir中的模式匹配异常
【发布时间】:2021-03-14 15:02:02
【问题描述】:

我有多个控制器方法,其中我与即将到来的参数进行模式匹配,其中之一是

  def index(conn, %{
        "id" => camera_exid,
        "from" => from,
        "to" => to,
        "limit" => "3600",
        "page" => _page
      }) do

当用户请求如http://localhost:4000/v2/cameras/pocri-yweod/recordings/snapshots?limit=3600&page=1

它会抛出一个错误,当然,它应该是通过错误,但是有什么方法可以比异常更优雅地处理这样的错误?不创建另一个具有更少值的索引来进行模式匹配?

我尝试创建一个非常基本的后备控制器

defmodule EvercamMediaWeb.FallbackController do
  use EvercamMediaWeb, :controller

  def call(conn, what) do
    IO.inspect(what)
    render_error(conn, 400, "error.")
  end
end

但是没有用。

是否可以为整个控制器制作它?当模式匹配的参数不匹配时,它会返回 400,同时说明缺少哪些参数?我是唯一匹配头部中确定的参数的模式。

【问题讨论】:

  • 在您的情况下,直接在控制器定义中匹配是不正确的,只需将其作为简单参数匹配,然后在函数内部从中获取您需要的数据。
  • @Daniel “不正确”这个词是完全错误的。匹配函数子句中的任何内容都很好。一个只需要 sink-all 子句def index(conn, incomplete), do: render_error ....
  • 这没有意义,因为他的参数是可选的,在这种情况下,您无法匹配所有可能的组合,因此您只是不匹配并尝试从参数中提取您需要的键。
  • 如果有 20 个 def 则创建 20 个不完整的 def?不是一个很好的解决方案,有什么我们可以做的,比如插件吗?或任何可以是全球性的解决方案? @AlekseiMatiushkin

标签: elixir phoenix-framework


【解决方案1】:

是的,它可以用于整个控制器,因为 phoenix 会在控制器中注入一个 action/2 插件,默认情况下,它会调用从路由器匹配的函数,并且它可以被覆盖。

在你的控制器中试试这个:

  def action(conn, _) do
    required_fields = %{
      index: ["id", "from", "to", "limit", "page"],
      action2: ["id", "x", "y"]
    }

    args = [conn, conn.params]

    missing_fields =
      Enum.reject(required_fields[action_name(conn)], fn x -> x in Map.keys(conn.params) end)

    case missing_fields do
      [] ->
        apply(__MODULE__, action_name(conn), args)

      fields ->
        conn
        |> put_status(:bad_request)
        |> text("missing fields: " <> inspect(fields))
    end
  end

你可以按照你喜欢的方式渲染,以防missing_fields列表不为空。

ps:返回错误 400 不是异常,这是一个处理良好的错误,正如 Jose 所说的 https://github.com/phoenixframework/phoenix/issues/2386#issuecomment-315590839

【讨论】:

    猜你喜欢
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多