Phoenix:如何服务单页应用程序

2024-01-13

我想将 Phoenix 设置为提供静态 index.html,无论发送到它的路由是什么,无需更改 URL,同时提供对非 html 资源(.js、.css、.jpg...)的访问,因为我的 SPA(在 Elm)会查看路线并找出要做什么。

基于this https://stackoverflow.com/questions/32407528/precompiled-single-page-apps-in-phoenix-app and this https://stackoverflow.com/questions/35100117/how-to-serve-static-page-in-phoenix-framework我尝试过以下方法,但没有成功

端点.ex

  plug Plug.Static,
    at: "/", from: :mosaic_api, gzip: false,
    only: ~w(assets css fonts images js favicon.ico robots.txt index.html)

路由器扩展程序

  scope "/", Api do
    pipe_through :browser # Use the default browser stack
    get "/*path", PageController, :index  # :elm
  end

页面控制器.ex

defmodule Api.PageController do
  use Api.Web, :controller

  plug :action  # Edit: now removed

  def index(conn, _params) do
    conn
    |> put_layout(false)
    |> render("index.html")
    # Edit: replaced 3 lines above by: html(conn, File.read!("priv/static/index.html"))
  end

  def elm(conn, _params) do
      redirect conn, to: "/index.html"
  end
end

With :index我收到一个与 Phoenix 相关的(但不是标准主页)页面和一个控制台错误(Plug.Conn.AlreadySentError) the response was already sent,同时与:elm我最终到达 /index.html 并且丢失了路由信息。


only: ~w(... index.html)

conn
|> put_layout(false)
|> render("index.html")

看来你试图渲染静态index.html那不行。这put_layout/2禁用或更改包装器布局。render/2设置要用作内容的文件。默认此文件位于/web/templates/MODULE/.

您可以使用Phoenix.Controller.html/2 https://hexdocs.pm/phoenix/Phoenix.Controller.html#html/2发送自定义 html 内容的函数。读取文件文件.读取!/2 http://elixir-lang.org/docs/stable/elixir/File.html#read!/1并将内容发送给客户端。

def index(conn, _params) do
  html(conn, File.read!("priv/static/index.html"))
end

我不确定是否还有其他更清洁的解决方案,但这应该可行。 希望这可以帮助。

EDIT:

解决AlreadySentError通过删除plug :action从您的控制器。从 0.14.0 版本开始自动调用。

看看这些0.13.x to 0.14.0升级说明 https://gist.github.com/chrismccord/57805158f463d3369103使您现有的应用程序加快速度。

  • Backward incompatible changes
    • [控制器]plug :action现在自动调用
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Phoenix:如何服务单页应用程序 的相关文章

  • 如何在自定义混合任务中从 Ecto 获取数据

    我想在自定义混合任务中通过 Ecto 显示来自数据库的数据 如何在我的任务中获取 Ecto 存储库 或启动它 我尝试过类似的方法 但没有成功 defmodule Mix Tasks Users List do use Mix Task us
  • 具有两个参数的路由的未定义 [controller]_path

    我在 Phoenix 应用程序中创建了一个控制器 名为ProgressController 这就是我的路由器文件的样子 defmodule MyTestApp Router do use MyTestApp Web router pipel
  • 我应该在 Elixir Phoenix 的控制器或模型中使用 Ecto.Repo 吗?

    对于控制器中的一些查询Phoenix 我有两个计划 Plan 1 defmodule Demo UserController do def index do This is just for example The point is Rep
  • Phoenix 框架中的动态模型

    有没有办法在Phoenix中动态创建和使用模型 我有一个存储有关客户表的元数据的应用程序 它们设置了一些字段 列名称和类型 然后向我发送 CSV 文件以进行解析和存储 我想根据存储的元数据生成一个模型 以便我可以使用 Ecto 来管理客户端
  • Elixir [42] 打印为“*”

    我有一个返回的角色模型列表p followings我想提取followed id将此模型列表中的字段放入单独的列表中 p followings returns Poaster Personas Following meta Ecto Sch
  • Phoenix 和 Ecto 以及 SELECT

    我在凤凰城建立了一个 Ecto 模型协会 一个组织有许多组织成员 在 OrganizationMember 控制器的 Edit 方法中 我尝试创建一个 SELECT 元素来保存所有可供选择的组织 在里面edit定义 我有以下两行 organ
  • 将 Phoenix 项目拆分为应用程序

    Mix 提供了一个伞式项目的功能 其中独立的功能 应用程序 可以一起运行 但可以松散耦合并单独开发 在我的 phoenix 应用程序中 我想将身份验证逻辑移动到一个单独的应用程序中 以便稍后重用它 然而 对于我的身份验证应用程序 模块 我需
  • 为什么 Phoenix (ecto/Postgresx) 在开发中无法连接

    我正在开始我的 Elixir Phoenix 之旅 但我的 postgres 连接遇到了一些问题 当我启动服务器时 我得到 mix phoenix server error Postgrex Protocol PID lt 0 214 0
  • 使用 Ecto 的时间戳向现有表添加时间戳

    这已被问到这里如何使用 Ecto 的时间戳向现有表添加时间戳 https stackoverflow com questions 35744390 how to add timestamps to an existing table wit
  • Elixir Phoenix 内联 CSS 用于发送电子邮件

    我正在使用凤凰城的 mailgun 库发送电子邮件 事实证明 当我查看 Gmail 帐户中的电子邮件时 它已被删除所有 css 类和外部 css 文件的链接 Mailgun 建议使用 css 内联库http blog mailgun com
  • Phoenix:如何服务单页应用程序

    我想将 Phoenix 设置为提供静态 index html 无论发送到它的路由是什么 无需更改 URL 同时提供对非 html 资源 js css jpg 的访问 因为我的 SPA 在 Elm 会查看路线并找出要做什么 基于this ht
  • 如何使用 Elixir 生成随机 url 安全字符串

    我需要能够生成随机 url 安全字符串 以便我可以在链接中使用这些字符串 例如发送到用户电子邮件的激活链接 那么如何生成它呢 有没有办法只用 Elixir 来做到这一点 或者我必须使用一些库 您可以做的是生成一个 Base64 编码的字符串
  • 输出端口“tcp_inet”上的值错误

    我正在使用 Phoenix 框架 它在下面运行 Cowboy 我偶尔会在日志中看到以下一对错误 Bad value on output port tcp inet GenServer PID lt 0 8423 1 gt terminati
  • Elixir Phoenix 生产服务器出现 Letscrypt 续订问题

    我有一个使用 Elixir Phoenix 框架构建的网站 该网站在开发和生产模式下都运行良好 当phoenix服务器在开发模式下运行时 我更新Let s Encrypt证书没有问题 但是当完全一样应用程序正在生产模式下运行 尝试更新时我不
  • Phoenix 框架中的可选路由参数

    我已经开始自学凤凰框架 http www phoenixframework org 他们的文档非常好 然而 在指定可选路由参数时 我遇到了障碍 这Phoenix 框架路由文档 http www phoenixframework org do
  • 如何测试 Phoenix 套接字是否已终止?

    我正在寻找一种方法来测试套接字是否被终止 被测试的代码执行以下操作 def handle in logout payload socket do stop logout socket gt assign user nil end 和我的测试
  • 如何在没有 javascript 的情况下从表单中修补或删除

    我正在 Phoenix 上编写一个简单的 CRUD 应用程序 如何在不使用 JavaScript 的情况下从表单提交 PATCH 和 DELETE 请求 啊我想通了 和rails一样
  • Ecto - 验证关联模型的存在

    如何验证 Ecto 中是否存在关联模型 schema foo do has many bar Bar timestamps end required fields w bar invalid 有办法这样做吗 并验证这些字段的最小 最大数量
  • 如何在phoenix中使用session连接?

    我有一个身份验证插头 我想测试我的控制器 问题是这个插头里的线有 user id get session conn user id 当我使用这种方法时它总是为零 我以前使用过dirty hack 但我不再想这样做 session Plug
  • 分配 @changeset 在 eex 模板中不可用

    我正在尝试学习包含 Ecto Model 的 Phoenix 表单系统 但我遇到了一个无法通过的问题 我创建了一个表格 div class jumbotron div

随机推荐