Cowboy路由指南说,每条路径都被构造为一个元组,其中包括“在初始化时将给予它 [请求处理程序] 的选项”。但它没有解释选项的目的,而且我不确定如何使用它们,因为传递给处理程序的 Req 对象包含有关路径及其绑定的信息。
那么如果路由选项不包含任何唯一的路径信息,它们有哪些用例呢?
选项被传递给处理程序init/3
方法。在处理程序指南中有使用翻译选项的示例。您可以有多个路径指向同一个处理程序,但选项不同:
{"/pl", toppage_handler, [{lang, fr}]}
{"/en", toppage_handler, [{lang, en}]}
在处理程序中,你可以有这样的东西:
-record(state, {
lang :: en | fr
%% More fields here.
}).
init(_Type, Req, Opts) ->
{_, Lang} = lists:keyfind(lang, 1, Opts),
{ok, Req, #state{lang=Lang}}.
handle(Req, State#state{lang = Lang}) ->
{ok, Req2} = cowboy_req:reply(200, [
{<<"content-type">>, <<"text/plain">>}
], translate_text(<<"Hello World!">>, Lang), Req),
{ok, Req2, State}.
另一个例子是从主机名中获取语言。例如,您可以根据收到请求的主机检测语言。
[{'fr.example.org', [
{"/", toppage_handler, [{lang, fr}]
]},
{'en.example.org', [
{"/", toppage_handler, [{lang, en}]
].
您可以实现相同的效果,使用PathMatch
andHostMatch
和语言值绑定将是 in Req
,但选项更通用。路由选项用于创建附加信息并将其传递给处理程序。