Setting up Absinthe on Phoenix + Bandit project

I am trying to set up Absinthe following the documentation here: Plug and Phoenix Setup — absinthe v1.7.8

on a brand new Phoenix 1.7 project.

I have generated the project with:

mix phx.new api --no-assets --no-ecto --no-dashboard --no-mailer --no-html --no-live --no-gettext --module=API 

and now I try to add Absinthe. I installed dependencies:

  defp deps do
    [
      {:phoenix, "~> 1.7.20"},
      {:telemetry_metrics, "~> 1.0"},
      {:telemetry_poller, "~> 1.0"},
      {:jason, "~> 1.2"},
      {:dns_cluster, "~> 0.1.1"},
      {:bandit, "~> 1.5"},
      {:absinthe_plug, "~> 1.5"}
    ]
  end

And I configured my router:


defmodule APIWeb.Router do
  use APIWeb, :router

  forward "/api/graphql", Absinthe.Plug,
    schema: API.Schema

  forward "/api/graphiql",
    Absinthe.Plug.GraphiQL,
    schema: API.Schema,
    interface: :simple
end

The app compiles but when I make requests to either /api/graphq or /api/graphiql I am getting:

[info] GET /api/graphiql                                                                                                                                                       
[error] ** (Plug.Conn.NotSentError) a response was neither set nor sent from the connection
    (bandit 1.6.7) lib/bandit/pipeline.ex:172: Bandit.Pipeline.commit_response!/1
    (bandit 1.6.7) lib/bandit/pipeline.ex:44: Bandit.Pipeline.run/4                  
    (bandit 1.6.7) lib/bandit/http1/handler.ex:12: Bandit.HTTP1.Handler.handle_data/3                                                                                          
    (bandit 1.6.7) lib/bandit/delegating_handler.ex:18: Bandit.DelegatingHandler.handle_data/3   
    (bandit 1.6.7) lib/bandit/delegating_handler.ex:8: Bandit.DelegatingHandler.handle_continue/2
    (stdlib 6.0.1) gen_server.erl:2163: :gen_server.try_handle_continue/3
    (stdlib 6.0.1) gen_server.erl:2072: :gen_server.loop/7                          
    (stdlib 6.0.1) proc_lib.erl:329: :proc_lib.init_p_do_apply/3

My schema so far is also generated from documentation:

defmodule API.Schema do
  use Absinthe.Schema

  @desc "An item"
  object :item do
    field(:id, :id)
    field(:name, :string)
  end

  # Example data
  @items %{
    "foo" => %{id: "foo", name: "Foo"},
    "bar" => %{id: "bar", name: "Bar"}
  }

  query do
    field :item, :item do
      arg(:id, non_null(:id))

      resolve(fn %{id: item_id}, _ ->
        {:ok, @items[item_id]}
      end)
    end
  end
end

Anyone knows what I’m doing wrong?

OK I generated the app again and did the set up steps and everything is working. I think I may have either generated app that’s too bare bones to work with Absinthe or made some other error along the way. It works now.

It would still be interesting to make a recursive diff and check. Assuming you have the time, of course, which we all know is not a given.

I deleted the previous app and it was never in the repo. I’m sorry :frowning:

1 Like

It’s okay man, I know you’re busy and have stuff to do.

I’m simply always interested in boiling down the exact causes of such seemingly random problems. It’s an endless fascination for me.

I have not used mix phx.new.web to generate the app, and then had to manually rename api_web to api etc.

If I was to bet on where I messed up, it’s somewhere there.

Next time. :smiley: