Erlang路由器出错

时间:2012-07-18 15:13:11

标签: erlang router mochiweb

我尝试使用Mochiweb制作一个彗星服务器,如there

如果我是从erlang shell做的,那就好了。

但是如果尝试从命令行使用mochiweb启动第一个节点:

erl -pa ebin edit deps/*/ebin -boot start_sasl -sname n1 -s server +K true -setcookie secret_key -s reloader

第二个与路由器:

erl -pa ebin edit deps/*/ebin -boot start_sasl -sname router -setcookie secret_key -eval 'net_adm:ping(n1@localhost), router:start_link().'

如果我从浏览器连接到mochiweb,我有这个错误

=CRASH REPORT==== 18-Jul-2012::19:04:45 ===
crasher:
initial call: mochiweb_acceptor:init/3
pid: <0.73.0>
registered_name: []
exception exit: {noproc,
                    {gen_server,call,
                        [undefined,{login,"234567e",<0.73.0>}]}}
  in function  gen_server:call/2
  in call from server_web:loop/2
  in call from mochiweb_http:headers/5
ancestors: [server_web,server_sup,<0.55.0>]
messages: []
links: [<0.57.0>,#Port<0.1406>]
dictionary: [{mochiweb_request_qs,
                  [{"session_id","234567e"},{"obj_id","page"}]},
              {mochiweb_request_path,"/polling"}]
trap_exit: false
status: running
heap_size: 2584
stack_size: 24
reductions: 1516

我认为问题在于来自router.erl的这个字符串:

-define(SERVER, global:whereis_name(?MODULE)).

因为-eval( net_adm:ping(n1 @ localhost))的第一部分启动时没有错误,我可以在节点中看到 n1 @ localhost ( )。即可。但是-eval( router:start_link())的第二部分不适用于?MODULE

如何解决此问题?

1 个答案:

答案 0 :(得分:0)

看起来应该全局注册的 gen_server 当前模块的名称(?MODULE被替换它)尚未启动。在这种情况下, global:whereis_name(?MODULE)将返回 undefined ,就像您在日志中看到的一样。

找到你应该做的那部分代码(通过在该模块中使用?MODULe和/或gen_server:start_link),并确保它在第一个节点上执行。