我在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中有效编写以减轻崩溃服务器的可能性的最佳实践是什么?只是一个丑陋的大尝试/捕获包裹整个代码?
答案 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;您可以想到的测试。这将迫使您编写高质量,稳定,可预测的代码,从而大大降低应用程序崩溃错误的可能性。