我的应用程序中有这个
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)
行是否应该解决?那怎么解决呢?
答案 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
。