Elixir 在插件路由器中,init函数的作用是什么?
试图了解Plug,特别是Plug.Router。来自文档()。根据规范,插件有一个init函数,该函数在初始化时被调用以传入选项,但这些选项在定义的路由中似乎不可用Elixir 在插件路由器中,init函数的作用是什么?,elixir,Elixir,试图了解Plug,特别是Plug.Router。来自文档()。根据规范,插件有一个init函数,该函数在初始化时被调用以传入选项,但这些选项在定义的路由中似乎不可用 没有可用选项的原因是什么?是否有一种模式允许它存在?这是《编程凤凰》一书的摘录: “有时候,你可能需要菲尼克斯做一些繁重的工作来改变你的选择。这就是init函数的工作初始化在编译时发生。Plug将使用init的结果作为要调用的第二个参数。因为init经常在编译时调用,所以它是验证选项和准备一些工作的最佳场所。这样,通话速度就可以尽可
没有可用选项的原因是什么?是否有一种模式允许它存在?这是《编程凤凰》一书的摘录: “有时候,你可能需要菲尼克斯做一些繁重的工作来改变你的选择。这就是init函数的工作初始化在编译时发生。Plug将使用init的结果作为要调用的第二个参数。因为init经常在编译时调用,所以它是验证选项和准备一些工作的最佳场所。这样,通话速度就可以尽可能快。因为call是一个工作平台,所以我们希望它尽可能少做工作。" 例如,在routes.ex文件中使用插件
pipeline :api do
plug :accepts, ["json"]
plug Example.Authenticated, repo: Example.Repo
end
repo:Example.repo
是传递给Example.repo中的init
函数的选项
defmodule Example.Authenticated do
import Plug.Conn
def init(opts) do
Keyword.fetch!(opts, :repo)
end
def call(conn, repo) do
...
end
end
我假设在Plug.Router的情况下,编译时的修改可能是加载构建/修改路由的模块-可能来自外部源?取决于您试图完成的任务。init函数的工作主要是使选项在编译时可用。然后将这些选项作为第二个论点
在我看来,我认为你可以根据插件功能或模块要完成的任务来决定是否有选项。这应该是答案。我是Phoenix和plug的新用户,从在线文档中看编译时方面并不明显。我不明白为什么一个简单的测试日志功能没有被使用,但是因为它在编译时,所以这是有意义的。