无法访问“ conn”中的参数键

时间:2018-06-28 10:24:27

标签: elixir phoenix-framework

我的应用程序中有这个

  defp aaabbbcc(conn, params) do
    conn = Plug.Conn.fetch_query_params(conn)

    Logger.info("#{Kernel.inspect(conn[:params]["some_custom_params"])}")

例外:

  Plug.Conn does not implement the Access behaviour

Plug.Conn.fetch_query_params(conn)行是否应该解决?那怎么解决呢?

1 个答案:

答案 0 :(得分:1)

您误解了fetch_query_params

请注意

  

此函数不会从主体获取参数。要从主体获取参数,请使用Plug.Parsers插件。

您应该这样使用它:

conn = Plug.Conn.fetch_query_params(conn)
params = conn.query_params
Logger.info("#{Kernel.inspect(params["some_custom_params"])}")
  

query_params-通过fetch_query_params / 2填充的请求查询参数

PS:conn[:params]在大多数情况下与conn.params相同。

这是fetch_query_params的实现:

  def fetch_query_params(%Conn{query_params: %Unfetched{}} = conn, opts) do
    %{params: params, query_string: query_string} = conn
    Plug.Conn.Utils.validate_utf8!(query_string, InvalidQueryError, "query string")
    length = Keyword.get(opts, :length, 1_000_000)

    if byte_size(query_string) > length do
      raise InvalidQueryError,
            "maximum query string length is #{length}, got a query with #{byte_size(query_string)} bytes"
    end

    query_params = Plug.Conn.Query.decode(query_string)

    case params do
      %Unfetched{} -> %{conn | query_params: query_params, params: query_params}
      %{} -> %{conn | query_params: query_params, params: Map.merge(query_params, params)}
    end
  end



 def decode(query, initial) do
    parts = :binary.split(query, "&", [:global])

    Enum.reduce(Enum.reverse(parts), initial, &decode_www_pair(&1, &2))
  end

它只是解码查询字符串,并将其分配给conn.query_params