gpt4 book ai didi

elixir - 从管道插头调用时,Plug.Conn.assign 不起作用

转载 作者:行者123 更新时间:2023-12-04 00:52:15 25 4
gpt4 key购买 nike

我正在关注 Phoenix Guide on Plugs创建我自己的Module Plug从 session 加载当前用户。 @user使用插件模块时未分配,但当我将其作为 router.ex 中的私有(private)函数调用时工作正常.

这是我的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返回修改后的连接。由于 Elixir 中的所有数据都是不可变的,因此无法修改旧数据。在您的情况下,您将丢弃 assign 的结果并且 conn 仍然指向旧连接。你可能想要这样的东西:

conn = assign(conn, :user, user)

这将重新绑定(bind) conn变量指向修改后的连接结构。当然,如果 assign(conn, :user, user) 也可以。将是函数中的最后一个表达式,因为它的结果将被返回。

关于elixir - 从管道插头调用时,Plug.Conn.assign 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31001596/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com