Если вы думаете использовать это в производстве, то не делайте этого!:).С моей точки зрения, не стоит делать приложение Phoenix ответственным за приложение node.js.Но если вы хотите запустить все это во время разработки как одну команду mix phx.server
, выполните следующие шаги:
Создайте GenServer
, которая запустит приложение nuxt и добавит этот genserver к наблюдению за приложениями три.assets_path
должен быть путь к вашему файлу nuxt app package.json, этот assets_path не обязательно должен быть в вашем приложении Phoenix.
defmodule NuxtServer do
use GenServer, restart: :permanent
require Logger
def start_link(assets_path, opts \\ []) do
GenServer.start(\__MODULE__, [assets_path], opts)
end
def init([assets_path]) do
# in assets folder package.json should contain under scripts node
# scripts: {
# ...
# "nuxt": "nuxt"
# }
port = Port.open({:spawn, "npm run nuxt"}, [{:cd, assets_path}])
ref = Port.monitor(port)
{:ok, %{port: port, ref: ref, assets_path: assets_path}}
end
def handle_info({:DOWN, _, :port, _, _}, %{assets_path: assets_path, ref: ref, port: port}) do
Logger.error("Nuxt server is down, restarting ...")
Port.close(port)
Port.demonitor(ref)
{:ok, state} = init([assets_path])
{:noreply, state}
end
def handle_info({_prot, {:data, msg}}, s) do
Logger.debug msg
{:noreply, s}
end
def handle_info(msg, state), do: super(msg, state)
end
, затем следуйте инструкциям, как добавить обратный прокси в Phoenix, используя, например,это lib , если вам нужен доступ ко всему через порт Phoenix http.