如何捕獲所有 JavaScript 錯誤並將其傳送到伺服器?


JavaScript 是一種著名的程式語言,是全球資訊網 (WWW) 的核心語言之一,與 HTML 和 CSS 並列。它允許程式設計師捕獲事件並修改文件物件模型 (DOM)。在本文中,我們將學習如何捕獲所有 JavaScript 錯誤並將其傳送到伺服器。

什麼是 onerror?

onerror 是一個事件,每當載入外部檔案或資源時發生錯誤,或者執行指令碼時發生錯誤時都會觸發。

語法

onerror = (event, source, lineno, colno, error) => {};

引數:以下是語法中提到的引數的描述

  • event:包含人類可讀錯誤訊息的字串。

  • source:提供導致問題的指令碼的 URL 的字串。

  • lineno:包含發生問題的指令碼檔案的行號的整數。

  • colno:包含發生問題的指令碼檔案的列號的整數。

  • error:丟擲的錯誤物件。

示例

在下面的示例中,我將訪問一個變數 a,該變數在程式碼中任何地方都沒有定義。這將導致 ReferenceError,並且我將使用 onerror 事件來捕獲錯誤。

<!DOCTYPE html>
<html>
<head>
    <title>How to catch a ReferenceError with onerror?</title>
</head>
<body>
    <h4>How to catch a ReferenceError with onerror?</h4>
    <div id="result"> </div>
    <script>
        window.onerror = (event, url, line, column, error) => {
            let msg = "";
            msg += "Error: " + error;
            document.getElementById("result").innerHTML = msg;
        };
        let sum = a + 2;
    </script>
</body>
</html>

演算法

我們將使用上面提到的 onerror 事件來幫助我們捕獲錯誤。捕獲錯誤後,我們將使用 AJAX(非同步 JavaScript 和 XML)將資料傳送到後端伺服器。我們將使用 XMLHttpRequest 物件來幫助我們向伺服器傳送請求。我們可以向伺服器傳送任何型別的請求,但出於說明的目的,我將傳送 POST 請求。

我們還將定義一個伺服器,我們將向其傳送資料。出於說明的目的,我們將使用一個帶有單個 POST 路由的非常簡單的 express 伺服器。我使用了中介軟體:cors 和 bodyParser,來幫助我輕鬆接收資料。

讓我們嘗試透過一個示例來理解這一點

示例

步驟 1:首先,我們將定義 HTML 檔案。

<!DOCTYPE html>
<html>
<head>
   <title>How to catch all JavaScript errors and send them to the server?</title>
</head>
<body>
   <h4>How to catch all JavaScript errors and send them to the server?</h4>
   <div>
      <button id="main">SEND</button>
   </div>
</body>
</html>

步驟 2:現在,我們將向按鈕新增一些樣式。

<style>
   #main{
      border-radius: 10px;
   }
</style>

步驟 3:現在我們將定義將錯誤傳送到伺服器的邏輯。

<script>
   let data = [];
   window.onerror = (event, url, line, column, error) => {
      let err = {
         line: line,
         column: column,
         msg: error.message,
      }
      data.push(err);
   };
   let button = document.getElementById("main");
   button.onclick = () => {
      let jsondata = JSON.stringify(data);
      let xhr = new XMLHttpRequest();
      let url = "https://:5000/";
      xhr.open('POST', url, true);
      xhr.setRequestHeader("Content-Type", "application/json");
      xhr.send(jsondata)
   }
   let sum = a + 2;
</script>

步驟 4:現在我們將定義接收資料的伺服器。

import express from 'express';
import cors from 'cors';
import bodyParser from 'body-parser';

const app = express();
const port = 5000;

var jsonParser = bodyParser.json();

app.use(cors());

app.post("/", jsonParser, (req, res) => {
   console.log(req.body);
});

app.listen(port, () => {
   console.log(`Example app listening on port ${port}`);
});

執行所有步驟後,最終程式碼應如下所示

前端

<!DOCTYPE html>
<html>

<head>
   <title>How to catch all JavaScript errors and send them to the server?</title>
   <style>
      #main{
         border-radius: 10px;
      }
   </style>
</head>

<body>
   <h4>How to catch all JavaScript errors and send them to the server?</h4>
   <div>
      <button id="main">SEND</button>
   </div>
   <script>
      let data = [];
      window.onerror = (event, url, line, column, error) => {
         let err = {
            line: line,
            column: column,
            msg: error.message,
         }
         data.push(err);
      };
      let button = document.getElementById("main");
      button.onclick = () => {
         let jsondata = JSON.stringify(data);
         let xhr = new XMLHttpRequest();
         let url = "https://:5000/";
         xhr.open('POST', url, true);
         xhr.setRequestHeader("Content-Type", "application/json");
         xhr.send(jsondata)
      }
      let sum = a + 2;
   </script>
</body>

</html>

後端

import express from 'express';
import cors from 'cors';
import bodyParser from 'body-parser';

const app = express();
const port = 5000;

var jsonParser = bodyParser.json();

app.use(cors());

app.post("/", jsonParser, (req, res) => {
   console.log(req.body);
});

app.listen(port, () => {
   console.log(`Example app listening on port ${port}`);
});

輸出

Example app listening on port 5000
[ { line: 34, column: 19, msg: 'a is not defined' } ]

結論

在本文中,我們看到了如何透過結合使用 XMLHttpRequest 物件和 onerror 事件來捕獲錯誤並將其傳送到伺服器。一旦我們在伺服器端收到錯誤,我們就可以制定策略向用戶提供適當的錯誤訊息,以便他/她可以相應地採取行動。

更新於:2023年9月12日

315 次瀏覽

啟動您的 職業生涯

完成課程後獲得認證

開始
廣告