2017-11-28 6 views
0

Elixir/Phoenix를 공부하기 시작한 이유는 무엇입니까?이 문제가 발생하는 이유는 무엇입니까? no function clause matching in Plug.Conn.put_resp_header/3 오류가 발생했습니다. 여기 Plug.Conn.put_resp_header/3에서 일치하는 함수 절이 없습니다.

내 코드입니다 :

def index(conn, params) do 
    page = Todo |> Repo.paginate(params) 

    conn 
    |> put_status(:ok) 
    |> put_resp_header("x-total-count", page.total_entries) 
    |> render("index.json", todos: page.entries) 
    end 

내가 확인했습니다

[error] #PID<0.457.0> running TodoApp.Endpoint terminated 
Server: localhost:4000 (http) 
Request: GET /api/todos 
** (exit) an exception was raised: 
    ** (FunctionClauseError) no function clause matching in Plug.Conn.put_resp_header/3 
     (plug) lib/plug/conn.ex:626: Plug.Conn.put_resp_header(%Plug.Conn{adapter: {Plug.Adapters.Cowboy.Conn, :...}, assigns: %{}, before_send: [#Function<1.82124947/1 in Plug.Logger.call/2>], body_params: %{}, cookies: %Plug.Conn.Unfetched{aspect: :cookies}, halted: false, host: "localhost", method: "GET", owner: #PID<0.457.0>, params: %{}, path_info: ["api", "todos"], path_params: %{}, peer: {{127, 0, 0, 1}, 50059}, port: 4000, private: %{TodoApp.Router => {[], %{}}, :phoenix_action => :index, :phoenix_controller => TodoApp.TodoController, :phoenix_endpoint => TodoApp.Endpoint, :phoenix_format => "json", :phoenix_layout => {TodoApp.LayoutView, :app}, :phoenix_pipelines => [:api], :phoenix_router => TodoApp.Router, :phoenix_view => TodoApp.TodoView, :plug_session_fetch => #Function<1.112984571/1 in Plug.Session.fetch_session/1>}, query_params: %{}, query_string: "", remote_ip: {127, 0, 0, 1}, req_cookies: %Plug.Conn.Unfetched{aspect: :cookies}, req_headers: [{"host", "localhost:4000"}, {"connection", "keep-alive"}, {"cache-control", "no-cache"}, {"user-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"}, {"postman-token", "d94524ad-4d13-e170-0ac5-021c21337895"}, {"accept", "*/*"}, {"accept-encoding", "gzip, deflate, br"}, {"accept-language", "en-US,en;q=0.9,pt;q=0.8"}], request_path: "/api/todos", resp_body: nil, resp_cookies: %{}, resp_headers: [{"cache-control", "max-age=0, private, must-revalidate"}, {"x-request-id", "1i0cddqagrkiocppi9404phdn4ajd9i7"}], scheme: :http, script_name: [], secret_key_base: "LH/fxSBb227JHpUba0PZAAYwf8N9NQCVmHe0SrnoUIXuHVUhWXeg3voq0H82qEl/", state: :unset, status: nil}, "x-total-count", 2) 
     (todo_app) web/controllers/todo_controller.ex:11: TodoApp.TodoController.index/2 
     (todo_app) web/controllers/todo_controller.ex:1: TodoApp.TodoController.action/2 
     (todo_app) web/controllers/todo_controller.ex:1: TodoApp.TodoController.phoenix_controller_pipeline/2 
     (todo_app) lib/todo_app/endpoint.ex:1: TodoApp.Endpoint.instrument/4 
     (phoenix) lib/phoenix/router.ex:278: Phoenix.Router.__call__/1 
     (todo_app) lib/todo_app/endpoint.ex:1: TodoApp.Endpoint.plug_builder_call/2 
     (todo_app) lib/plug/debugger.ex:99: TodoApp.Endpoint."call (overridable 3)"/2 
     (todo_app) lib/todo_app/endpoint.ex:1: TodoApp.Endpoint.call/2 
     (plug) lib/plug/adapters/cowboy/handler.ex:15: Plug.Adapters.Cowboy.Handler.upgrade/4 
     (cowboy) /Users/fskinner/Git/phoenix/todo_app/deps/cowboy/src/cowboy_protocol.erl:442: :cowboy_protocol.execute/4 

추적 ... page.entries (당신이 추적에 볼 수) 2의 값이 그 파이프를 보통의 Plug.Conn.put_resp_header/3로 바꾸려고했지만 성공하지 못했습니다.

나는 기반 그냥이 같은 API 모드에서 피닉스에 의해 생성 된 생성 코드의 코드 ... :

def create(conn, %{"todo" => todo_params}) do 
    changeset = Todo.changeset(%Todo{}, todo_params) 

    case Repo.insert(changeset) do 
     {:ok, todo} -> 
     conn 
     |> put_status(:created) 
     |> put_resp_header("location", todo_path(conn, :show, todo)) 
     |> render("show.json", todo: todo) 
     {:error, changeset} -> 
     conn 
     |> put_status(:unprocessable_entity) 
     |> render(TodoApp.ChangesetView, "error.json", changeset: changeset) 
    end 
    end 

내가 그 파이프를 제거하고 단 것을 지킬 때 엔드 포인트부터 작동되는 페이지 매김 제대로 반환 렌더링 func

답변

0

음, 그냥 바보 같아 보입니다. 문제는 Plug.Conn.put_resp_header/3이 문자열을 마지막 arg로 기대하고 page.total_count이 정수였습니다.

Integer.to_string(page.total_entries)

최종 솔루션을 통해 구문 분석이 해결을했다 :

def index(conn, params) do 
    page = Todo |> Repo.paginate(params) 

    conn 
    |> put_status(:ok) 
    |> put_resp_header("x-count", Integer.to_string(page.total_entries)) 
    |> render("index.json", todos: page.entries) 
    end 
+1

_Sidenote : _ 대신 처음부터 베어 언어 코어를 학습의 프레임 워크를 배울 수있는 좋은 생각이 일반적으로 그 이유는. – mudasobwa

+0

동의합니다! 그러나 내가 사용하고있는 페이지 매김 라이브러리에 대한 문서를 읽을 수있는 특정 경우의 문제와 더 명확한 오류가 도움이 될 것입니다 (예를 들어 문자열을 기대한다고 말함) –