处理" 500"的最佳实践Nodejs中的错误

时间:2016-05-15 16:59:39

标签: node.js

我在NodeJS中创建一个TCP服务器,如下所示:

net = require('net');
var clients = [];

// Start a TCP Server
net.createServer(function (socket) {

  socket.name = socket.remoteAddress + ":" + socket.remotePort 
  clients.push(socket);
  socket.write("Welcome " + socket.name + "\n");
  broadcast(socket.name + " joined the chat\n", socket);


  socket.on('data', function (data) {
    broadcast(socket.name + "> " + data, socket);
  });

  socket.on('end', function () {
    clients.splice(clients.indexOf(socket), 1);
    broadcast(socket.name + " left the chat.\n");
  });

  function broadcast(message, sender) {
    clients.forEach(function (client) {
      if (client === sender) return;
      client.write(message);
    });
  }

}).listen(5000);

来自像php + nginx这样的架构,无论我如何弄乱代码,我都无法崩溃我的Nginx服务器(在大多数情况下),最糟糕的情况是我的一个用户获得了500个错误页面和生活继续。但是在NodeJS中,如果我忘了检查用户发送的分母必须大于零,然后我尝试做something/0这样的事情,整个服务器都会崩溃,因为我是实际上创建服务器加上应用程序,而不仅仅是在PHP中的应用程序。在NodeJS中有效编写以减轻崩溃服务器的可能性的最佳实践是什么?只是一个丑陋的大尝试/捕获包裹整个代码?

2 个答案:

答案 0 :(得分:2)

我个人发现以下文章非常有启发性: https://www.joyent.com/developers/node/design/errors

你应该阅读它!

作者区分了操作错误和程序员错误。

操作错误是“正确编写的程序遇到的运行时问题”。这些主要是外部“东西”出错,包括用户。任何强大的程序都应该尝试通过适当的错误处理来处理这些问题。 在您的情况下,您的程序应检查有效的用户输入,包括值范围。

程序员错误“是程序中的错误”。作者认为该程序甚至不应该尝试从错误中恢复;如果你已经预料到了这个bug,那么这个bug就不会出现在那里,那么你怎么能期望编写代码来纠正你最初没有预料到的情况呢?如果程序员没有预料到(导致问题),那么就会崩溃。这比继续运行软件风险要小,现在可能处于未定义状态。

由于您不想要停机,这也意味着您应该在“重启”中运行您的软件,这会在软件崩溃后重启您的软件。为此,我过去曾使用pm2,这非常适合我。

答案 1 :(得分:0)

不要让服务器崩溃。或者,换句话说:编写容错代码。

如果您的服务器上有这样的代码:

function calculateValue(a, b) {
    return a / b;
}

...然后不要让b为零。通过验证输入(例如b !== 0并吐出HTTP 400,如果它是false)或通过默认(例如,b = b <= 0 ? 1 : b)来保护它。

然后,,这是最重要的部分:测试您的代码。更好的是,首先测试你的代码(经典test-driven development),写出各种各样的快乐路径&#34;和&#34;边缘情况&#34;您可以想到的测试。这将迫使您编写高质量,稳定,可预测的代码,从而大大降低应用程序崩溃错误的可能性。