【问题标题】:What is PHP exit()/die() equivalent in Node.jsNode.js 中的 PHP exit()/die() 等价物是什么
【发布时间】:2014-01-17 11:44:27
【问题描述】:

【问题讨论】:

  • 有时很有趣,当人们批评php 时,这些“高级”语言中不提供这些难以言喻的原始事物(如exit 和许多其他事物)。不幸的是,在 node.js 中,您必须将 if/return 从数十个函数正确地转换为 exit 。而且,return(应该返回不同的值)到底如何成为exit..难以置信的方式。

标签: php node.js


【解决方案1】:

process.exit() 是等效的调用。

【讨论】:

  • 它们不是等价的。 PHP 的 die() 不会像 Node.js 的 process.exit() 那样终止服务器,它只是停止终止文件中的剩余代码。不幸的是,没有等价物。
  • @MMiller 部分正确,因为 PHP 具有完全不同的架构。 PHP 起源于 CGI,在这种情况下(即执行 CGI 脚本的单个进程)它似乎完全等同于我,因为它停止了进程。对于这个问题,我认为 FCGI 和类似技术只是优化而不是游戏规则改变者。因此,我认为您的问题非常挑剔,并没有反映 IMO 的现实问题。非常相似,您可以说在反向代理后面运行多个由 supervisord 启动的 note 实例将使 process.exit() 不会停止服务器。
  • 如果您不在函数中,也可以使用return。不过也有一些不同。有关更多详细信息,请参阅我的答案。 @MMiller 我想这可能更像你的意思?
  • @nl-x AFAIK 在函数外部使用 return 几乎等同于 process.exit(),但他似乎正在寻找一个终止整个“服务器”的函数,而这样的事情确实如此对于像 PHP 这样的 CGI 类应用程序来说并不存在。
  • 既然还需要require()这个库,简单的单行就是require('process').exit();
【解决方案2】:

我会使用throw。 Throw 将导致当前请求结束,并且不会终止节点进程。您可以使用错误视图捕获该输出。

throw new Error('your die message here');

【讨论】:

  • throwprocess.exit() 相比的优势在于 IMO 您有错误消息。缺点(或有时是优点)是它可能会在某个地方被捕获。因此,我不会将其视为 die() 等价物,而是作为人们应该考虑的许多用例的替代方案。
  • 对此投赞成票!我更愿意throw 并按顺序获取我的catch,而不是核对整个网络服务器。
  • @AvadData 这显然取决于您的用例。问题显然是等效于die(),而throw 将等效于throw...
  • 同意这些是不同的。掷球可能会被接住,不会出现立即退出的期望。考虑到在即将到来的 nodejs 中捕获每个异常的推动,使用 throw 立即退出将无法达到此目的。您可以轻松地进行一次投掷,接住它,然后在接住它时退出进程。有点冗长,但是您可以处理所有案例(很好的错误消息并立即退出)。
  • 智能,尽管除了@UliKöhler 提到的之外还有另一个限制。 throwing 不支持表达式使用,因此您根本无法将其放在任何地方。好吧,至少在该提案成为语言 github.com/tc39/proposal-throw-expressions 之前
【解决方案3】:

它需要向标准错误报告(而不是标准输出)并以非零状态退出才能成为 die() ...

function die (errMsg) 
{
    if (errMsg)
        console.error(errMsg);
    process.exit(1);
}

【讨论】:

    【解决方案4】:

    如果不在函数中,可以使用:

    return;
    

    不过你也可以使用@UliKöhler的建议:

    process.exit();
    

    有一些区别:

    • return 结尾更优雅。 process.exit() 更突然。
    • return 不设置退出代码,就像 process.exit() 一样。

    例子:

    try {
        process.exitCode = 1;
        return 2;
    }
    finally {
        console.log('ending it...'); // this is shown
    }
    

    这将在控制台上打印 ending it... 并以退出代码 1 退出。

    try {
        process.exitCode = 1;
        process.exit(2);
    }
    finally {
        console.log('ending it...'); // this is not shown
    }
    

    这将在控制台上不打印任何内容并以退出代码 2 退出。

    【讨论】:

      【解决方案5】:

      您现在可以使用 npm 包 dump-die。 我在 github 上查看了这个包,它实际上使用了process.exit(1)

      首先通过npm install dump-die安装。它有一个dd() 函数。

      let foo = 'bar'
      let hodor = { hodor: 'hodor' }
      dd(foo, hodor)
      // returns
      // 'bar'
      // { hodor: 'hodor' }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-11
        • 2021-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-20
        相关资源
        最近更新 更多