2017-12-29 15 views
0

私はelixirに新しく、最近GenServerがクライアント/サーバーAPIを管理する良い方法であることがわかりました。そこで、データベース接続を管理するGenServerモジュールを作成しようとしましたが失敗しました。GenServerを使用してinitメソッドを実行できませんでした

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がそのinit()メソッドでRedisのデータベースに接続するために使用される:以下私のコードです。しかし、それはエラーの下に返します。それは最後にnilを印刷し、なぜそれがエラーを返し、なぜ私は理解していない

iex([email protected])15> RedisClient.start("redis://localhost") 
{:error, {:bad_return_value, {#PID<0.6623.0>}}} 
iex([email protected])16> 
17:58:20.592 [info] connect to url redis://localhost 

nil 

iex([email protected])17> Redix.start_link("redis://localhost") 
{:ok, #PID<0.7443.0>} 

RedixのAPIコールは問題がないようですので、私のGenServerの実装の何が問題:私は以下のように直接Redisを呼び出す場合は正常に動作しますか?あなたが成功した場合にinit/1から{:ok, state}を返す必要が

答えて

3

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

またはあなたが正確に何Redix.start_linkリターンを返しているので、あなたは、単にそれを返すことができます。

def init({url}) do 
    Logger.info("connect to url #{url}"); 
    Redix.start_link(url) 
end 
関連する問題