使用 GenServer 时 运行 init 方法失败
Failed to run init method on using GenServer
我是 elixir 的新手,最近发现 GenServer
是管理 client/server 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
用于在其init()方法中连接到redis数据库。但它 returns 以下错误:
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
我不明白为什么它 returns 是一个错误,为什么它最后打印 nil
。如果我直接调用 Redis
就可以正常工作,如下所示:
iex(tbc@192-168-1-7)17> Redix.start_link("redis://localhost")
{:ok, #PID<0.7443.0>}
看来Redix
上的API调用没有问题,那么我的GenServer实现有什么问题吗?
您需要从 init/1
return {:ok, state}
成功:
{:ok, conn} -> {:ok, conn}
或者由于您 return 正是 Redix.start_link
return,您可以简单地 return 即:
def init({url}) do
Logger.info("connect to url #{url}");
Redix.start_link(url)
end
我是 elixir 的新手,最近发现 GenServer
是管理 client/server 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
用于在其init()方法中连接到redis数据库。但它 returns 以下错误:
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
我不明白为什么它 returns 是一个错误,为什么它最后打印 nil
。如果我直接调用 Redis
就可以正常工作,如下所示:
iex(tbc@192-168-1-7)17> Redix.start_link("redis://localhost")
{:ok, #PID<0.7443.0>}
看来Redix
上的API调用没有问题,那么我的GenServer实现有什么问题吗?
您需要从 init/1
return {:ok, state}
成功:
{:ok, conn} -> {:ok, conn}
或者由于您 return 正是 Redix.start_link
return,您可以简单地 return 即:
def init({url}) do
Logger.info("connect to url #{url}");
Redix.start_link(url)
end