2017-12-29 12 views
0

Ich bin neu zu Elixier und vor kurzem festgestellt, dass GenServer ist eine gute Möglichkeit, Client/Server-API zu verwalten. Also habe ich versucht, ein GenServer-Modul zur Verwaltung der Datenbankverbindung zu erstellen, aber es ist fehlgeschlagen. Unten ist mein Code:Fehler beim Ausführen von Init-Methode bei Verwendung von 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 

Das Modul RedisClient verwendet wird, um eine redis Datenbank in seiner Methode init() zu verbinden. Aber es gibt unter Fehler:

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 

Ich verstehe nicht, warum es einen Fehler zurückgibt, und warum er druckt nil am Ende. Es funktioniert gut, wenn es Redis direkt wie unten nennen:

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

Es scheint, dass der API-Aufruf auf Redix kein Problem hat, so was falsch mit meiner GenServer Umsetzung?

Antwort

3

Sie müssen {:ok, state} von init/1 auf Erfolg zurück:

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

oder da Sie Rückkehr genau das, was Redix.start_link zurückkehrt, können Sie einfach das zurück:

def init({url}) do 
    Logger.info("connect to url #{url}"); 
    Redix.start_link(url) 
end 
Verwandte Themen