代码之家  ›  专栏  ›  技术社区  ›  Adam Millerchip

插件解析器:引发parseerror

  •  1
  • Adam Millerchip  · 技术社区  · 7 年前

    我正在编写一个插件解析器,其中包括使用poison解码json(我更愿意让 Plug.Parsers.JSON 这样做,但我需要读取原始请求主体,以根据签名验证它,所以这是不可能的)。

    我在用 Poison.decode/2 解码json。这将返回 {:error, ...} 元组出错。作为一个插件解析器,我想我应该 Plug.Parsers.ParseError 如果在解析过程中出现错误。然而 ParseError 期望 exception 结构。我没有,只有元组从 毒药解码/2 是的。

    作为解决办法,我可以使用 Poison.decode!/2 rescue 引发的错误,将其作为 分析错误 ,但如果不提高 decode/2 有空。

    所以我的问题是,越来越抽象:

    1. 我该怎么养 分析错误 来自没有源异常的解析器?
    2. 我需要提高 分析错误 ,还是提出我自己的例外更好?
    3. 有没有更好的方法,允许我在不重新实现json解析的情况下验证签名?
    2 回复  |  直到 7 年前
        1
  •  0
  •   Aleksei Matiushkin    7 年前

    我该怎么养 ParseError 来自没有源异常的解析器?

    您需要创建 Plug.Parsers.ParseError 你自己:

    raise %Plug.Parsers.ParseError{exception: %MyException{message: "Failed to parse"}}
    

    我需要提高 分析错误 ,还是提出我自己的例外更好?

    你可以想养什么就养什么,但事实上 分析错误 我看没有任何理由提出不同的意见。

    有没有更好的方法⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

    这个太固执己见了。json解析似乎没问题。

        2
  •  0
  •   Adam Millerchip    7 年前

    (我宁愿让 Plug.Parsers.JSON 这样做,但我需要看 原始的请求主体来根据签名验证它,所以这不是 可能的)。

    1. 有没有更好的方法,允许我在不重新实现json解析的情况下验证签名?

    出租 plug.parsers.json文件 这样做实际上是最好的选择。由于版本1.5.1,可以提供 custom body reader 到可以缓存正文以供以后使用的分析器。这是一个比重新实现json解析器插件更通用的解决方案。

    这是我的自定义阅读器:

    def read_body(conn, opts) do
      case Plug.Conn.read_body(conn, opts) do
        {res, body, conn} when res in [:ok, :more] ->
          {res, body, update_in(conn.assigns[:raw_body], &((&1 || "") <> body))}
    
        unknown ->
          unknown
      end
    end