分叉到另一个文件导致EADDRINUSE?

时间:2016-10-09 17:31:29

标签: node.js child-process httpserver

我有一个名为 client.js 的文件require("child_process").fork() source.js ,只是为了让一切更清洁。但是,在fork中的某个位置,当我使用EADDRINUSE创建http服务器时,它正在执行另一个进程并导致connect错误。我该如何解决这个问题,以便创建一个http服务器而不会出错?

我的source.js看起来(有点):

app.use(serve(cwd));
app.use(function(req, res){ // code });

var server = http.createServer(app);
server.listen(8080);
server.on("listening", function(){
    console.log("server running with: ");
    console.log("  port: "+process.env.PORT);
});

1 个答案:

答案 0 :(得分:1)

在系统级,fork()有点像:

  1. 计算当前(父)进程的内存
  2. 在内存中保留此尺寸
  3. 复制整个过程,包括但不限于:
    • 状态
    • open fd's
    • 打开套接字
  4. 当且仅当上述步骤返回非错误时,请清除此项 内存并使用它来启动分叉的子进程,维护通信 与父母沟通的渠道
  5. 因此,在第3步中,fork尝试打开AGAIN您的侦听端口,这就是您收到错误的原因

    传统的解决方案可能是在执行服务器之前分叉 听,但在节点意义上,从理论上说,首先应该没有任何理由进行分叉,如果你要求另一个“节点”进程,那就更少了。

    可能你可以使用某种异步调用()或依赖你的节点版本来解决它,甚至使用Promises