kelsey_w

kelsey_w

I’ve set up my umbrella app into three apps - simple Plug app, Phoenix app (called Chemistry), and database.

The first app simply receives a request, queries the database for the appropriate record, and redirects to an external url on that record. The second phase of the project was making this app into part of an umbrella app structure and separating the database into its own app. Additionally, I created a Phoenix app to handle uploading images.

Goal: do not load the entire Phoenix app if it’s not necessary. My idea was to set up routing so that the request is forwarded from the Plug app to the Phoenix/Chemistry app.

I’ve not been successful in implementing it this way - only in the opposite direction. When I forward from the Plug app - forward '/chemistry', to: Chemistry.Router - it returns the following compilation error:

(UndefinedFunctionError) function Chemistry.Router.init/1 is undefined (module Chemistry.Router is not available)

Am I not correctly importing the module? Any tips on the best way to handle routes for two applications?

Thanks!

Showing Posts 1 to 10

amnu3387

amnu3387

Your phoenix app is working if you visit one of its routes bypassing the plug app?

kelsey_w

kelsey_w OP

Correct. The apps are on different ports (4000 & 4004) so I can access the routes by their corresponding port, but I’d like to go to one port (for the plug app) and be able to access the routes in the Phoenix app.

amnu3387

amnu3387

I think the problem is that the phoenix router is not a plug, whereas forward is expecting a plug, I think you need to give it the endpoint and not the router?

kelsey_w

kelsey_w OP

Ah, thanks @amnu3387! As you suggested, forward "/chemistry", to: ChemistryWeb.Endpoint works. However, it doesn’t load the assets, and submitting forms fails because they’re missing the chemistry/ prefix. Might have to figure out a different routing solution.

Thanks for your help!

amnu3387

amnu3387

Forward will eat the prefix, I think you want something more in line with what is being done here in this sample app

https://github.com/wojtekmach/acme_bank/blob/master/apps/master_proxy/lib/master_proxy/plug.ex

So one plug above where you pretty much raw match on the path, followed by a call to the appropriate phoenix endpoint or plug (in your case). Not sure this solves the assets, but at least the path will be passed entirely

chrismccord

chrismccord

Creator of Phoenix

The phoenix router is most definitely a Plug :slight_smile: You can forward to a router as much as you like so that’s not an issue.

amnu3387

amnu3387

Ah - I just skimmed through the Router src and didn’t see the init method?
So what’s missing there? The app being a dependency on the other umbrella app?

mbuhot

mbuhot

We use a very similar setup, here’s how we structured the app:

The plug app defines a router that uses match <path>, to: <plug> to forward requests without altering the path.

  match "/events/*_", to: Events.Router
  match "/exq/*_",    to: Exq.Router
  match "/health",    to: Health.Router
  match "/report/*_", to: Report.Router
  match "/stats/*_",  to: Stats.Router

Then each of the umbrella apps defines a Router module, with Phoenix.Router for the nice url helpers.

We add a TestEndpoint module in each umbrella app under /test/support/test_endpoint.ex and load it conditionally in the Application module based on Mix.env

  def start(_type, _args) do
    children = case Mix.env do
      :test -> [Health.TestEndpoint]
      _ -> []
    end
    Supervisor.start_link(children, strategy: :one_for_one, name: Health.Supervisor)
  end

This allows you to develop each umbrella app in isolation, then stitch them all together with the plug router.

The plug router has to depend on every other app to forward to them:

 defp deps do
    [
      {:events, in_umbrella: true},
      {:health, in_umbrella: true},
      {:stats, in_umbrella: true},
      {:reports, in_umbrella: true},
   ]
  end
18
Post #8
loon

loon

Have been trying to forward the routes and no success. Then I found this thread, I am trying to use the match function but seem like it crash with the Phoenix.Router’s match/5 function .

Can someone provide an example how to use the Plug.Router and the match function?

I am new to Elixir/Phoenix, :slight_smile:

mbuhot

mbuhot

Plug.Router — Plug v1.20.2 has an example for using Plug.Router.
It’s different to the Phoenix.Router that would be generated with a new Phoenix app.

I think you could achieve the same effect with a Phoenix.Router using :* as the verb and a glob path:

match(:*, "/some/prefix/*path", SomeOther.Router, nil)
— All posts loaded —

Where Next? Top

Trending in Questions Top

RSP87
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
nseaSeb
Hello, I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
apz
I’m new to elixir and just tried to install the elixirLS extension for VScode(ium) and it is throwing some errors that I would like help ...
New

Other Trending Topics Top

JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Dmk
Xamal is a deployment tool for Elixir apps that deploys native releases to bare metal servers over SSH. It’s a port of GitHub - basecamp/...
New
webofbits
With AI doing more of the implementation work, I’ve been wondering how much coding I should deliberately keep doing myself. My main conc...
#ai
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews