Plug.Conn.assign 从 Pipeline Plug 调用时不工作
Plug.Conn.assign not working when called from a Pipeline Plug
我正在按照 Phoenix Guide on Plugs 创建我自己的 Module Plug
从会话加载当前用户。 @user
在使用插件模块时没有被分配,但是当我在 router.ex
.
中将它作为私有函数调用时工作正常
这是我的 web/router
:
defmodule MyApp.Router do
use MyApp.Web, :router
pipeline :browser do
plug :accepts, ["html"]
plug :fetch_session
plug :fetch_flash
plug :protect_from_forgery
plug MyApp.Plugs.User
end
# Scopes and Routes...
end
这是我的模块(在 web/plugs/user.ex
中):
defmodule MyApp.Plugs.User do
import Plug.Conn
def init(default), do: default
def call(conn, default) do
user = %{
id: get_session(conn, :user_id),
username: get_session(conn, :username)
}
assign(conn, :user, user)
IO.inspect conn
end
end
我试着检查它是否真的被分配了,但没有:
%Plug.Conn{adapter: {Plug.Adapters.Cowboy.Conn, :...}, assigns: %{},
before_send: [#Function<1.75757453/1 in Plug.CSRFProtection.call/2>,
#Function<1.30521811/1 in Phoenix.Controller.fetch_flash/2>,
#Function<0.39713025/1 in Plug.Session.before_send/2>,
#Function<1.7608073/1 in Plug.Logger.call/2>,
#Function<0.72065156/1 in Phoenix.LiveReloader.before_send_inject_reloader/1>],
body_params: %{},
cookies: ....
Plug.Conn.assign
returns 修改后的连接。由于 Elixir 中的所有数据都是不可变的,因此无法修改旧数据。在您的情况下,您将丢弃 assign
的结果并且 conn 仍然指向旧连接。你可能想要这样的东西:
conn = assign(conn, :user, user)
这将重新绑定 conn
变量以指向修改后的连接结构。当然,如果 assign(conn, :user, user)
是函数中的最后一个表达式,它也可以工作,因为它的结果将被返回。
我正在按照 Phoenix Guide on Plugs 创建我自己的 Module Plug
从会话加载当前用户。 @user
在使用插件模块时没有被分配,但是当我在 router.ex
.
这是我的 web/router
:
defmodule MyApp.Router do
use MyApp.Web, :router
pipeline :browser do
plug :accepts, ["html"]
plug :fetch_session
plug :fetch_flash
plug :protect_from_forgery
plug MyApp.Plugs.User
end
# Scopes and Routes...
end
这是我的模块(在 web/plugs/user.ex
中):
defmodule MyApp.Plugs.User do
import Plug.Conn
def init(default), do: default
def call(conn, default) do
user = %{
id: get_session(conn, :user_id),
username: get_session(conn, :username)
}
assign(conn, :user, user)
IO.inspect conn
end
end
我试着检查它是否真的被分配了,但没有:
%Plug.Conn{adapter: {Plug.Adapters.Cowboy.Conn, :...}, assigns: %{},
before_send: [#Function<1.75757453/1 in Plug.CSRFProtection.call/2>,
#Function<1.30521811/1 in Phoenix.Controller.fetch_flash/2>,
#Function<0.39713025/1 in Plug.Session.before_send/2>,
#Function<1.7608073/1 in Plug.Logger.call/2>,
#Function<0.72065156/1 in Phoenix.LiveReloader.before_send_inject_reloader/1>],
body_params: %{},
cookies: ....
Plug.Conn.assign
returns 修改后的连接。由于 Elixir 中的所有数据都是不可变的,因此无法修改旧数据。在您的情况下,您将丢弃 assign
的结果并且 conn 仍然指向旧连接。你可能想要这样的东西:
conn = assign(conn, :user, user)
这将重新绑定 conn
变量以指向修改后的连接结构。当然,如果 assign(conn, :user, user)
是函数中的最后一个表达式,它也可以工作,因为它的结果将被返回。