我有一个带有文件字段的HTML表单,用于将文件上传到/file我的Phoenix应用程序中的路由.
我从命令行模仿这种行为,curl -v -F "file=@MyTestFile" http://localhost:4000/file/以便更快地进行测试.
当我使用一个大文件(转折点似乎约为7.7MB)时,我从Plug获得以下异常:
18:40:38.897 [错误]错误在过程<0.420.0>与退出值:{[{原因,#{ ' 例外 '=>真,' 结构 '=>' Elixir.Plug.Parsers.RequestTooLargeError',消息=>零}},{MFA,{ 'Elixir.Plug.Adapters.Cowboy.Handler',INIT,3}},{堆栈跟踪,[{ 'Elixir.Plug.Parsers',减少,如图6所示,[{文件," LIB /插......
是否有解决方法允许上传更大的文件?
:length在Plug中似乎有一个选项关键字,但我怎么能从凤凰城设置它?这个特殊价值8_000_000被选中的原因是什么?
我在凤凰上建立了宁静的api(json).而且我不需要html的支持.
如何覆盖凤凰城的错误?示例错误: - 500 - 404没有找到路由和其他.
我想title在凤凰城的子视图/控制器中设置应用程序模板中的标记.
该title标签是内部的web/templates/layout/app.html.eex模板,但我有一个ArticlesController这使得在<%= @inner %>Rails中来的时候,会用yield电话,但无法找到其在凤凰城等价的.
将属性从其子项传递到父模板/视图的正确方法是什么?
我现在被困了几个小时,试图弄清楚如何在没有任何其他框架的情况下配置Plug.Static (Phoenix,Sugar,...); 只是牛仔,插头和Elixir.我只是不知道如何把东西放在路由器里.
plug :match
plug Plug.Static, at: "/pub", from: :cerber
plug :dispatch
get "/" do
Logger.info "GET /"
send_resp(conn, 200, "Hello world\n")
end
Run Code Online (Sandbox Code Playgroud)
Plug.Static在正确的地方吗?不应该之后plug :dispatch吗?index.html?index.html应该位于何处我迷失了......
感谢您的反馈
将此代码示例作为Plug来处理身份验证:
defmodule Financeweb.APIAuth do
...
def call(conn, _opts) do
...
if authenticated_user do
conn
|> assign(:current_user, user)
else
conn
|> send_resp(401, "{\"error\":\"unauthorized\"}")
|> halt
end
end
end
Run Code Online (Sandbox Code Playgroud)
所以,我通过current_user下游传递变量Plug.Conn.assign/3.在Phoenix控制器中获取此变量的最佳方法是什么?我这样做(下面的代码),但我确信有更好的方法来做到这一点.
def index(conn, _) do
user_id = conn.assigns.current_user.id
end
Run Code Online (Sandbox Code Playgroud) def create(conn, %{"data" => %{"attributes" => user_params}}) do
changeset = User.changeset(%User{}, user_params)
case Repo.insert(changeset) do
{:ok, user} ->
UserMailer.send_welcome_email(user)
conn
|> put_status(:created)
|> render("show.json", model: user)
{:error, changeset} ->
conn
|> put_status(:unprocessable_entity)
|> render(MyApp.ChangesetView, "error.json", changeset: changeset)
end
end
Run Code Online (Sandbox Code Playgroud)
在此控制器操作中,UserMailer.send_welcome_email是同步的,请求等待.
我想让它异步,所以产生了这样的过程
spawn_link(fn ->
UserMailer.send_welcome_email(user)
end)
Run Code Online (Sandbox Code Playgroud)
请求不会等到邮件发送完毕.
Supervisor吗?spawn_link失败了,也记录在我们的凤凰日志中,它会这样做)我有这样的订阅.
defmodule Rebirth.Subscription do
use Rebirth.Web, :model
schema "subscriptions" do
...
belongs_to :user, Rebirth.User
...
end
...
def update_user(model, params \\ :empty) do
model
|> cast(params, @required_fields, @optional_fields)
|> cast_assoc(:user, required: false)
end
end
Run Code Online (Sandbox Code Playgroud)
我想将用户与订阅相关联
所以我试过了
Rebirth.Subscription.update_user(subscription, %{user_id: 1})
Run Code Online (Sandbox Code Playgroud)
要么
Rebirth.Subscription.update_user(subscription, %{user: user})
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我收到以下错误:
** (ArgumentError) unknown assoc `user` in `cast_assoc`
Run Code Online (Sandbox Code Playgroud)
如何更新user_id?
谢谢!
我对Elixir和Phoenix Framework很新,所以可能我的问题有点愚蠢.
我有一个应用程序,Elixir + Phoenix Framework作为后端,Angular 2作为前端.我使用Phoenix Channels作为前端/后端交换的渠道.我发现了一个奇怪的情况:如果我从后端向前端发送大量数据,那么特定的通道进程内存消耗就会达到数百MB.即使在传输结束后,每个连接(每个通道进程)也会占用大量内存.
以下是来自后端频道说明的代码段:
defmodule MyApp.PlaylistsUserChannel do
use MyApp.Web, :channel
import Ecto.Query
alias MyApp.Repo
alias MyApp.Playlist
# skipped ... #
# Content list request handler
def handle_in("playlists:list", _payload, socket) do
opid = socket.assigns.opid + 1
socket = assign(socket, :opid, opid)
send(self, :list)
{:reply, :ok, socket}
end
# skipped ... #
def handle_info(:list, socket) do
payload = %{opid: socket.assigns.opid}
result =
try do
user = socket.assigns.current_user
playlists = user
|> Playlist.get_by_user
|> order_by([desc: :updated_at])
|> Repo.all …Run Code Online (Sandbox Code Playgroud) 我有一个问题,关于如何最好地处理从我的凤凰应用程序的体系结构中的第三方API获取数据.基本上,我有一个控制器接收客户端的IP地址作为参数.然后,我需要从外部API获取与该IP地址关联的地理位置,并将它们存储在数据库中(即ip和geolocation).
现在我的方法是使用一个插件,然后在连接结构中返回结果.
但我也可以通过直接在模型中创建函数来获取数据,然后在变更集操作期间调用它.
或许还有另一种选择,例如将其作为OTP应用程序.
在这里寻找关于最佳方法的一些指导,或者至少在一方与另一方之间进行权衡.
虽然我的场景是具体的,但这可能是人们遇到的常见设计问题.
文档(https://hexdocs.pm/plug/Plug.Conn.html)命名两个函数,允许在一个键值对中存储conn
assign(conn, key, value)
Run Code Online (Sandbox Code Playgroud)
为连接中的键分配值
put_session(conn, key, value)
Run Code Online (Sandbox Code Playgroud)
将指定值放在给定键的会话中
这两个功能有什么区别?