簡體   English   中英

處理Nodejs中“ 500”錯誤的最佳實踐

[英]Best practices to handle “500” errors in Nodejs

我在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中有效編寫以減輕服務器崩潰的可能性的最佳實踐是什么? 只是一個丑陋的大嘗試/捕獲來包裝整個代碼?

我個人通過Joyent頗有啟發性地找到了以下文章: https : //www.joyent.com/developers/node/design/errors

您應該閱讀它!

作者區分操作錯誤和程序員錯誤。

操作錯誤是“正確編寫的程序遇到的運行時問題”。 這些大多是外部“東西”(包括用戶)出問題的地方。 任何健壯的程序都應嘗試通過適當的錯誤處理來盡可能地解決這些問題。 在您的情況下,您的程序應檢查有效的用戶輸入,包括值范圍。

程序員錯誤 “是程序中的錯誤 ”。 作者認為該程序甚至不應該嘗試從錯誤中恢復; 如果您已預見到該錯誤,那么該錯誤就不會出現在最初的位置,那么您如何期望編寫代碼來糾正最初未曾預料到的情況? 如果程序員沒有(正確地)預料到會導致問題的情況,那就死機 這比繼續運行您的軟件(現在可能處於未定義狀態)的風險要小。

由於您不希望停機,因此這也意味着您應該在“重新啟動器”中運行軟件,一旦崩潰,它將在重新啟動軟件后重新啟動。 為此,我過去使用過pm2 ,效果不錯。

根本就不要讓您的服務器崩潰。 或者,換一種說法:編寫容錯代碼。

如果您的服務器上有這樣的代碼:

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

...那么不要讓b永遠為零。 通過驗證輸入(例如b !== 0並返回HTTP 400,如果為false )或通過默認設置(例如b = b <= 0 ? 1 : b )來保護它。

然后, 這是最重要的部分 :測試代碼。 更好的是, 首先編寫您可以想到的各種“幸福之路”和“邊緣案例”測試來測試您的代碼 (經典的測試驅動的開發 )。 這將迫使您編寫高質量,穩定,可預測的代碼,從而大大減少了導致應用程序崩潰的錯誤的可能性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM