首页 > 解决方案 > 无法访问“conn”中的参数键

问题描述

我的应用程序中有这个:

  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)应该治愈吗?那怎么解决呢?

标签: elixirphoenix-framework

解决方案


你误会了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.


推荐阅读