【问题标题】:Why node server.listen do not returns to shell为什么节点 server.listen 不返回 shell
【发布时间】:2015-07-20 08:11:01
【问题描述】:

节点文件可以描述从服务器到简单的脚本,甚至是只打印到控制台的东西:

//logger.js
console.log('Hello World');

// in the terminal
> node logger.js
Hello World
>

http 包(和其他)如何不将命令提示符返回给用户;他们如何使流程保持活力?

//server
require('http').createServer(function (req, res) {
  res.end('Hello World');
}).listen(3000);

// in the terminal
> node server.js
// process stays in the foreground, no prompt back

【问题讨论】:

  • 从您的 cmets 的回答中,听起来您想要构建以这种方式运行的东西。通常,如果您仍然有一些事情发生(服务器正在侦听、setTimeout 等待等),这将自动发生。什么是你正在做的应该保持进程活着但没有?
  • @AaronDufour 而是要了解它是如何工作的 ;-)

标签: node.js process server


【解决方案1】:

如果有正在侦听的套接字,节点将不会退出。这就是 TL;DR 的答案。 (关于事件队列的其他答案是正确的,这可能是程序未退出的原因,但这不是 server.listen() 的情况。)

在后台,http.createServer()(最终)正在调用server.listen() 调用server.listen() 将阻止进程退出,因为server.listen() 创建了一个套接字。注意from the docs for socket.ref()

与 unref 相反,在以前未引用的套接字上调用 ref 不会让程序退出,如果它是唯一剩下的套接字(默认行为)。如果 socket 是 refd,再次调用 ref 将无效。

还有socket.unref():

如果这是事件系统中唯一活动的套接字,则在套接字上调用 unref 将允许程序退出。如果套接字已经 unrefd,再次调用 unref 将无效。

如果你想从那里更上一层楼,我相信你需要深入了解 Node.js/io.js 的底层 C 或 C++。

【讨论】:

    【解决方案2】:

    在你的情况下,当事件队列中没有事件并且不存在后台任务(可以将事件添加到事件队列)时,节点将退出,它是后者。

    【讨论】:

    • 那么像 http.createServer 一样操作并留手的最简单方法是什么?
    • 保持手是什么意思?
    • 正如我的问题:让进程在前台,没有提示返回
    • setInterval(function() {}, 1000000) 会做
    • 不,你问的是如何像 http 一样“行动”,并继续运行。对于http.createServer,你可以随时阅读代码
    【解决方案3】:

    @user2786771 是真的。

    更详细的解释可以在this article找到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多