【发布时间】: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