Не удалось запустить метод инициализации при использовании GenServer

Я новичок в elixir и недавно обнаружил, что GenServer — это хороший способ управления клиент-серверным API. Поэтому я попытался создать модуль GenServer для управления подключением к базе данных, но потерпел неудачу. Ниже мой код:

defmodule RedisClient do
  use GenServer
  require Logger

  # Client
  def start(url) do
    GenServer.start(__MODULE__, {url})
  end

  def init({url}) do
    Logger.info("connect to url #{url}");
    case Redix.start_link(url) do
        {:ok, conn} -> {conn}
        {:error, err} -> {:error, err}
    end
  end

end

Модуль RedisClient используется для подключения к базе данных Redis в методе init(). Но он возвращает ошибку ниже:

iex(tbc@192-168-1-7)15> RedisClient.start("redis://localhost")
{:error, {:bad_return_value, {#PID<0.6623.0>}}}
iex(tbc@192-168-1-7)16> 
17:58:20.592 [info]  connect to url redis://localhost

nil

Я не понимаю, почему он возвращает ошибку и почему он печатает nil в конце. Он отлично работает, если я вызываю Redis напрямую, как показано ниже:

iex(tbc@192-168-1-7)17> Redix.start_link("redis://localhost")
{:ok, #PID<0.7443.0>}

Похоже, вызов API на Redix не вызывает проблем, так что же не так с моей реализацией GenServer?


person Joey Yi Zhao    schedule 29.12.2017    source источник


Ответы (1)


Вам нужно вернуть {:ok, state} из init/1 в случае успеха:

{:ok, conn} -> {:ok, conn}

или, поскольку вы возвращаете именно то, что возвращает Redix.start_link, вы можете просто вернуть это:

def init({url}) do
  Logger.info("connect to url #{url}");
  Redix.start_link(url)
end
person Dogbert    schedule 29.12.2017