如何阻止节点 js 服务器崩溃

Posted

技术标签:

【中文标题】如何阻止节点 js 服务器崩溃【英文标题】:how to stop node js server from crashing 【发布时间】:2012-12-27 16:22:24 【问题描述】:

我是节点 js 的新手。我试图创建一个简单的 HTTP 服务器。我按照著名的例子创建了一个“Hello World!”服务器如下。

var handleRequest = function(req, res) 
  res.writeHead(200);
  res1.end('Hello, World!\n');
;

require('http').createServer(handleRequest).listen(8080);

console.log('Server started on port 8080');

运行此代码将按预期正确启动服务器。但是尝试访问http://127.0.0.1:8080 会抛出一个res1 未定义的错误,从而使其崩溃。我希望服务器仍然继续运行并在遇到错误时优雅地报告错误。

我如何实现它?我试过 try-catch 但这对我没有帮助:(

【问题讨论】:

见***.com/a/8114990/435413(自动重启javascript)或***.com/questions/5999373/…(防止崩溃) 嗨本杰明,我故意将其键入为 res1 以产生错误。我的问题是关于如何在不使服务器崩溃的情况下处理此类错误。 【参考方案1】:

这里有一堆cmets。首先,为了让您的示例服务器正常工作,需要在使用之前定义 handleRequest。

1- 你真正想要的,即阻止进程退出,可以通过处理 uncaughtException (documentation) 事件来处理:

var handleRequest = function(req, res) 
    res.writeHead(200);
    res1.end('Hello, World!\n');
;
var server = require('http').createServer(handleRequest);
process.on('uncaughtException', function(ex) 
    // do something with exception
);
server.listen(8080);
console.log('Server started on port 8080');

2- 我建议在您的代码上使用 try catch(e) ,例如:

var handleRequest = function(req, res) 
    try 
      res.writeHead(200);
      res1.end('Hello, World!\n');
     catch(e) 
      res.writeHead(200);
      res.end('Boo');
    
;

3- 我猜这个例子只是一个例子而不是实际代码,这是一个可以防止的解析错误。我提到了这一点,因为您不需要在异常捕获处理程序上出现解析错误。

4- 请注意,节点process 将来会被domain 替换

5- 我宁愿使用像 express 这样的框架,也不愿做这些事情。

6- 推荐讲座:*** - NodeJS best practice for exception handling

【讨论】:

1 错误,2 异步代码错误,4 错误,因为进程要补充域,域现在也可以工作 @BenjaminGruenbaum 1 为什么?进一步解释+它确实有效并防止应用程序崩溃。 2 作者从未说过他需要处理异步代码的解析异常。 4 域处于不稳定版本,节点文档明确表示“使用域 INSTEAD OF 进程” 谢谢汤姆... ponint 1 为我工作... 我会听从您的建议。我会考虑使用快递。【参考方案2】:

我不是针对您的问题详细信息,而是您关于防止节点服务器崩溃的问题标题。您可能可以使用 DOMAIN,这可能会阻止您的服务器在抛出 uncaughtException 时崩溃。

domain = require('domain'),
d = domain.create();

d.on('error', function(err) 
  console.error(err);
);

更多详情请转至http://shapeshed.com/uncaught-exceptions-in-node/

除了使用这个方法必须try-catch你的block。

【讨论】:

【参考方案3】:

也许你应该在使用之前定义handleRequest

require('http').createServer(handleRequest).listen(8080);

function handleRequest(req, res) 
  res.writeHead(200);
  res1.end('Hello, World!\n');
;

或者

var handleRequest = function(req, res) 
  res.writeHead(200);
  res1.end('Hello, World!\n');
;

require('http').createServer(handleRequest).listen(8080);

你应该确定res1也存在。

【讨论】:

不,javascript 会自动将“var”语句移动到作用域的顶部。 嗨@NULL,是的... handleRequest 应该在 createServer 行之上。我的错。我错误地复制粘贴了它(现在更新问题)。现在,来到 res1 错误,我知道错误的原因。我试图询问如何优雅地处理它。 @BenjaminGruenbaum 是的 handleRequest 已定义但为 undefined 。这就像写:var a; b(a) a = function()... 不,@BenjaminGruenbaum 是对的。函数声明被提升(这与匿名函数分配给 var 不同) 是的,这种方式 undefined 被传递给一个函数。

以上是关于如何阻止节点 js 服务器崩溃的主要内容,如果未能解决你的问题,请参考以下文章

几个小时后节点服务器崩溃

几个小时后节点服务器崩溃

JS-阻止冒泡事件与事件委托

当服务器关闭/崩溃时,Node JS 会自动重启所有永远的 JS 进程

是否可以使用节点 js 托管 *** 服务器? [关闭]

垃圾收集需要很长时间[如何调试收集的内容?]