2017-12-29 34 views
0

저는 elixir에 익숙하지 않고 최근에 클라이언트/서버 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가 초기화() 메소드의 레디 스 데이터베이스에 연결하는 데 사용되는 : 다음은 내 코드입니다. 그러나 그것은 오류 아래 반환이 말에 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를 호출하는 경우 그것은 잘 작동? 또는 당신이 정확히 Redix.start_link 수익률을 반환하고 있기 때문에, 당신은 단순히 그것을 반환 할 수

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

을 :

답변

3

당신은 성공에 init/1에서 {:ok, state}을 반환해야

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