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!
Trending in Questions
Other Trending Topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixirconf-us
- #ai
- #blog-post
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #elixirconf-eu
- #metaprogramming
- #hex










Showing Posts 1 to 10- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
amnu3387
Your phoenix app is working if you visit one of its routes bypassing the plug app?
kelsey_w
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
I think the problem is that the phoenix router is not a plug, whereas
forwardis expecting a plug, I think you need to give it the endpoint and not the router?kelsey_w
Ah, thanks @amnu3387! As you suggested,
forward "/chemistry", to: ChemistryWeb.Endpointworks. However, it doesn’t load the assets, and submitting forms fails because they’re missing thechemistry/prefix. Might have to figure out a different routing solution.Thanks for your help!
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
The phoenix router is most definitely a Plug
You can
forwardto a router as much as you like so that’s not an issue.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
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.Then each of the umbrella apps defines a
Routermodule, withPhoenix.Routerfor the nice url helpers.We add a
TestEndpointmodule in each umbrella app under/test/support/test_endpoint.exand load it conditionally in theApplicationmodule based onMix.envThis 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:
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,
mbuhot
Plug.Router — Plug v1.20.2 has an example for using
Plug.Router.It’s different to the
Phoenix.Routerthat would be generated with a new Phoenix app.I think you could achieve the same effect with a
Phoenix.Routerusing:*as the verb and a glob path: