基于 @sentry/react 实现一个简易的 JS 错误收集功能

最近开发的自用英语学习小网页,发现在移动端使用的时候发现有点问题,只能刷新页面。做一个简易的 JS 错误收集功能。

收集错误

前端的报错有很多,包含资源异常、 js 代码异常、未捕获 promise 异常、react 框架内部捕获异常等。

自己去写这些逻辑,比较繁琐,且容易遗漏。而 @sentry/react 虽然是 sentry 服务的 SDK ,但可以利用它的 beforeSend 事件,阻止上报,自行组织上报格式,传到自己的接口中。

  • dsn 需要填写,否则无法触发上报
  • 必须在挂载 react 组件到 dom 前进行初始化
  • 通过 Sentry.ErrorBoundary 包裹根组件,收集框架相关异常
import * as Sentry from "@sentry/react";
import { createRoot } from "react-dom/client";
import "./index.css";
import App from "./App";

Sentry.init({
  dsn: "https://examplePublicKey@o0.ingest.sentry.io/0",
  beforeSend(event) {
    const data = {
      level: event.level,
      platform: event.platform,
      url: event.request?.url,
      userAgent: event.request?.headers?.["User-Agent"],
      errorType: event.exception?.values?.[0]?.type,
      errorValue: event.exception?.values?.[0]?.value,
      errorStacktrace: JSON.stringify(event.exception?.values?.[0]?.stacktrace?.frames),
    };
    console.log("[Sentry beforeSend] 捕获到异常:", data);

    return null; // 阻止发送到 Sentry 平台(如果只想本地处理)
  },
});

const container = document.getElementById("root") as HTMLDivElement;
const root = createRoot(container);

root.render(
  <Sentry.ErrorBoundary fallback={<div></div>}>
    <App />
  </Sentry.ErrorBoundary>,
);

自行编写错误收集接口

使用一个独立的 sqlite 数据库,建立模型,与正常业务的数据分离开来。

编辑简单的增删改查接口,即可收集信息,并使用表格展示出来。