gpt4 book ai didi

elixir - Plug 路由器是否需要匹配/调度管道?

转载 作者:行者123 更新时间:2023-12-05 09:14:51 26 4
gpt4 key购买 nike

我有一个路由器模块,可以将请求转发到其他路由器。在这个路由器中,我有一个由 plug(:match)plug(:dispatch) 组成的管道。

defmodule Example.Router do
use Plug.Router

plug(:match)
plug(:dispatch)

forward("/check", to: Example.Route.Check)

get("/", do: send_resp(conn, 200, "router"))
end

在第二个模块中,我有相同的管道:

defmodule Example.Route.Check do
use Plug.Router

plug(:match)
plug(:dispatch)

get "/", do: send_resp(conn, 200, "ok")
end

我在这里看到的问题是我似乎总是需要 plug(:match)plug(:dispatch) 在所有 Plug路由器。所以我有以下问题:

  1. 这真的有必要吗?
  2. 是否所有路由器都需要在具有路由的同一个文件中有一个管道?

最佳答案

是的,两个插头都是必需的:

  • :match plug 负责匹配传入请求到路由器中定义的路由之一。

  • :dispatch插件负责最终处理匹配路由中的请求。


这里最明显的问题是:

Why not just do it automatically, since this needs to be done for every request?

  1. 首先,这是因为 有一种显式而不是隐式做事的设计理念。

  2. 其次,也是更重要的一点,插件按照定义的顺序执行。这使开发人员可以完全控制传入请求的处理方式。


例如,您可能希望在路由匹配之前检查 Authorization header ,并从那里停止或继续请求。或者您可能希望在一个单独的过程中更新页面浏览量,一旦路由匹配但在处理之前。另一种常见的情况是 parse a JSON request 路由匹配后。

您可以通过自定义管道来完成所有这些以及更多操作:

defmodule Example.Router do
use Plug.Router

plug(CheckRateLimit)
plug(VerifyAuthHeader)
plug(:match)
plug(LogWebRequest)
plug(Plug.Parsers, parsers: [:json], ...)
plug(:dispatch)

# ...
end

将匹配的路由转发到其他路由器的能力可以使您的网络服务器更加复杂。例如,您可以检查基本路由器中的 API 速率限制,将 /admin 路由转发到单独的 AuthorizedRouter 并放置自定义 VerifyAuthHeader 插件在这些路由匹配之前就在那里。

关于elixir - Plug 路由器是否需要匹配/调度管道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53429712/

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