首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法使用GenServer运行初始化方法

无法使用GenServer运行初始化方法
EN

Stack Overflow用户
提问于 2017-12-29 15:00:55
回答 1查看 102关注 0票数 0

我刚接触elixir,最近发现GenServer是管理客户机/服务器应用程序接口的好方法。因此,我尝试创建一个GenServer模块来管理数据库连接,但失败了。下面是我的代码:

代码语言:javascript
运行
复制
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数据库。但它返回以下错误:

代码语言:javascript
运行
复制
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,它可以正常工作,如下所示:

代码语言:javascript
运行
复制
iex(tbc@192-168-1-7)17> Redix.start_link("redis://localhost")
{:ok, #PID<0.7443.0>}

看起来Redix上的API调用没有问题,那么我的GenServer实现有什么问题呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-29 15:38:42

如果成功,您需要从init/1返回{:ok, state}

代码语言:javascript
运行
复制
{:ok, conn} -> {:ok, conn}

或者,由于您返回的正是Redix.start_link返回的内容,因此您可以简单地返回它:

代码语言:javascript
运行
复制
def init({url}) do
  Logger.info("connect to url #{url}");
  Redix.start_link(url)
end
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48018779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档