牛仔的路由选项的目的是什么?



Cowboy路由指南说,每个路径都被构造为一个元组,其中包括"初始化时将给它[请求处理程序]的选项"。但它并没有解释这些选项的用途,而且我不知道如何使用它们,因为传递给处理程序的Req对象包含关于路径及其绑定的信息。

那么,如果路由选项不包含任何唯一的路径信息,它们有什么用例?

选项被传递给处理程序init/3方法。在处理程序指南中,有一个使用翻译选项的示例。您可以有多个指向同一处理程序的路径,使用不同的选项:

{"/pl", toppage_handler, [{lang, fr}]}
{"/en", toppage_handler, [{lang, en}]}

在handler中,你可以有这样的东西:

-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}.

另一个例子是从hostname中提取语言。例如,您可以根据收到请求的主机来检测语言。

[{'fr.example.org', [
        {"/", toppage_handler, [{lang, fr}]
    ]},
  {'en.example.org', [
        {"/", toppage_handler, [{lang, en}]
].

您可以使用PathMatchHostMatch实现相同的功能,并且语言值绑定将在Req中,但选项更通用。路由选项用于创建附加信息并将其传递给处理程序。