6

我是节点 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 但这对我没有帮助:(

4

3 回答 3

6

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

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

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将来节点将被替换为

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

6- 推荐讲座:StackOverflow - NodeJS 异常处理的最佳实践

于 2013-01-13T17:41:43.297 回答
1

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

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

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

有关更多详细信息,请访问http://shapeshed.com/uncaught-exceptions-in-node/

除了使用此方法之外,还必须尝试捕获您的块。

于 2014-03-15T13:32:23.723 回答
0

也许你应该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也存在。

于 2013-01-13T17:24:40.663 回答