2

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

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

4

1 回答 1

4

选项被传递给处理程序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}]
].

您可以实现相同的效果,使用PathMatchandHostMatch和语言值绑定将是 in Req,但选项更通用。路由选项用于创建附加信息并将其传递给处理程序。

于 2014-09-18T06:32:09.397 回答