เชธเช‚เชคเซเชฐเซ€ เชธเชพเชฅเซ‡ เชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชฎเชพเช‚ เชŸเซเชฐเซ…เช•เชฟเช‚เช— เชญเซ‚เชฒเซ‹

เชธเช‚เชคเซเชฐเซ€ เชธเชพเชฅเซ‡ เชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชฎเชพเช‚ เชŸเซเชฐเซ…เช•เชฟเช‚เช— เชญเซ‚เชฒเซ‹

เช†เชœเซ‡ เชนเซเช‚ เชคเชฎเชจเซ‡ เชฐเซ€เชเช•เซเชŸ เชเชชเชฎเชพเช‚ เชฐเซ€เช…เชฒ-เชŸเชพเช‡เชฎ เชเชฐเชฐ เชŸเซเชฐเซ‡เช•เชฟเช‚เช— เชฆเซเชตเชพเชฐเชพ เชฒเชˆ เชœเชˆเชถ. เชซเซเชฐเชจเซเชŸเชเชจเซเชก เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชฌเช— เชŸเซเชฐเซ‡เช•เชฟเช‚เช— เชฎเชพเชŸเซ‡ เชฅเชคเซ‹ เชจเชฅเซ€. เช•เซ‡เชŸเชฒเซ€เช• เช•เช‚เชชเชจเซ€เช“ เช˜เชฃเซ€เชตเชพเชฐ เชฌเช— เชŸเซเชฐเซ‡เช•เชฟเช‚เช—เชจเซ‡ เชฌเชพเชœเซ เชชเชฐ เชฐเชพเช–เซ‡ เช›เซ‡, เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ, เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เชตเช—เซ‡เชฐเซ‡ เชชเช›เซ€ เชคเซ‡เชจเชพ เชชเชฐ เชชเชพเช›เชพ เชซเชฐเซ‡ เช›เซ‡. เชœเซ‹ เช•เซ‡, เชœเซ‹ เชคเชฎเซ‡ เชคเชฎเชพเชฐเชพ เช‰เชคเซเชชเชพเชฆเชจเชจเซ‡ เชตเชงเซ เชธเชพเชฐเชพ เชฎเชพเชŸเซ‡ เชฌเชฆเชฒเซ€ เชถเช•เซ‹ เช›เซ‹, เชคเซ‹ เชชเช›เซ€ เชคเซ‡ เช•เชฐเซ‹!

1. เชคเชฎเชจเซ‡ เชธเช‚เชคเซเชฐเซ€เชจเซ€ เชœเชฐเซ‚เชฐ เช•เซ‡เชฎ เช›เซ‡?

เชนเซเช‚ เชงเชพเชฐเซเช‚ เช›เซเช‚ เช•เซ‡ เชคเชฎเชจเซ‡ เชชเซเชฐเซ‹เชกเช•เซเชถเชจ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชฌเช—เซเชธ เชŸเซเชฐเซ…เช• เช•เชฐเชตเชพเชฎเชพเช‚ เชฐเชธ เช›เซ‡

เชถเซเช‚ เชคเชฎเชจเซ‡ เชฒเชพเช—เซ‡ เช›เซ‡ เช•เซ‡ เช† เชชเซ‚เชฐเชคเซเช‚ เชจเชฅเซ€?

เช เซ€เช• เช›เซ‡, เชšเชพเชฒเซ‹ เชตเชฟเช—เชคเซ‹ เชœเซ‹เชˆเช.

เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“ เชฎเชพเชŸเซ‡ เชธเช‚เชคเซเชฐเซ€เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเชพ เชฎเซเช–เซเชฏ เช•เชพเชฐเชฃเซ‹:

  • เชญเซ‚เชฒเซ‹ เชธเชพเชฅเซ‡ เช•เซ‹เชก เชœเชฎเชพเชตเชคเซ€ เชตเช–เชคเซ‡ เชคเชฎเชจเซ‡ เชœเซ‹เช–เชฎเซ‹เชฅเซ€ เช›เซเชŸเช•เชพเชฐเซ‹ เชฎเซ‡เชณเชตเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡
  • เช•เซ‹เชก เชชเชฐเซ€เช•เซเชทเชฃเชฎเชพเช‚ QA เชจเซ‡ เชฎเชฆเชฆ เช•เชฐเซ‹
  • เชเชกเชชเซ€ เชธเชฎเชธเซเชฏเชพ เชธเซ‚เชšเชจเชพเช“ เชฎเซ‡เชณเชตเซ‹
  • เชเชกเชชเชฅเซ€ เชญเซ‚เชฒเซ‹ เชธเซเชงเชพเชฐเชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพ
  • เชเชกเชฎเชฟเชจ เชชเซ‡เชจเชฒเชฎเชพเช‚ เชญเซ‚เชฒเซ‹เชจเซเช‚ เช…เชจเซเช•เซ‚เชณ เชชเซเชฐเชฆเชฐเซเชถเชจ เชฎเซ‡เชณเชตเชตเซเช‚
  • เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ/เชฌเซเชฐเชพเช‰เชเชฐ เชธเซ‡เช—เชฎเซ‡เชจเซเชŸ เชฆเซเชตเชพเชฐเชพ เชญเซ‚เชฒเซ‹เชจเซ‡ เชธเซ‰เชฐเซเชŸ เช•เชฐเซ‹

เชธเซ€เช‡เช“ / เชฒเซ€เชก เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฎเชพเชŸเซ‡เชจเชพ เชฎเซเช–เซเชฏ เช•เชพเชฐเชฃเซ‹

  • เชชเซˆเชธเชพ เชฌเชšเชพเชตเซ‹ (เชธเช‚เชคเซเชฐเซ€ เชคเชฎเชพเชฐเชพ เชธเชฐเซเชตเชฐ เชชเชฐ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡)
  • เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชฎเซ‡เชณเชตเซ‹
  • เชตเชพเชธเซเชคเชตเชฟเช• เชธเชฎเชฏเชฎเชพเช‚ เชคเชฎเชพเชฐเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชฎเชพเช‚ เชถเซเช‚ เช–เซ‹เชŸเซเช‚ เช›เซ‡ เชคเซ‡ เชธเชฎเชœเชตเซเช‚
  • เชคเชฎเชพเชฐเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชธเชพเชฅเซ‡ เชฒเซ‹เช•เซ‹เชจเซ‡ เช•เซ‡เชŸเชฒเซ€ เชธเชฎเชธเซเชฏเชพเช“ เช›เซ‡ เชคเซ‡ เชธเชฎเชœเชตเซเช‚
  • เชคเชฎเชพเชฐเชพ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“เช เชญเซ‚เชฒ เช•เชฐเซ€ เชนเซ‹เชฏ เชคเซ‡เชตเชพ เชธเซเชฅเชพเชจเซ‹ เชถเซ‹เชงเชตเชพเชฎเชพเช‚ เชธเชนเชพเชฏ เช•เชฐเซ‹

เชฎเชจเซ‡ เชฒเชพเช—เซ‡ เช›เซ‡ เช•เซ‡ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“เชจเซ‡ เชชเชนเซ‡เชฒเชพ เช† เชฒเซ‡เช–เชฎเชพเช‚ เชฐเชธ เชนเชถเซ‡. เชคเชฎเซ‡ เชคเชฎเชพเชฐเชพ เชฌเซ‹เชธเชจเซ‡ เชธเช‚เชคเซเชฐเซ€เชจเซ‡ เชเช•เซ€เช•เซƒเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเชฎเชœเชพเชตเชตเชพ เช•เชพเชฐเชฃเซ‹เชจเซ€ เช† เชธเซ‚เชšเชฟเชจเซ‹ เชชเชฃ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹.

เชตเซเชฏเชตเชธเชพเชฏ เชธเซ‚เชšเชฟเชฎเชพเช‚ เช›เซ‡เชฒเซเชฒเซ€ เช†เช‡เชŸเชฎ เชธเชพเชฅเซ‡ เชธเชพเชตเชšเซ‡เชค เชฐเชนเซ‹.

เชถเซเช‚ เชคเชฎเชจเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชฐเชธ เช›เซ‡?

เชธเช‚เชคเซเชฐเซ€ เชธเชพเชฅเซ‡ เชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชฎเชพเช‚ เชŸเซเชฐเซ…เช•เชฟเช‚เช— เชญเซ‚เชฒเซ‹

เชธเช‚เชคเซเชฐเซ€ เชถเซเช‚ เช›เซ‡?

เชธเซ‡เชจเซเชŸเซเชฐเซ€ เช เชเช• เช“เชชเชจ เชธเซ‹เชฐเซเชธ เชฌเช— เชŸเซเชฐเซ‡เช•เชฟเช‚เช— เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เช›เซ‡ เชœเซ‡ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“เชจเซ‡ เชตเชพเชธเซเชคเชตเชฟเช• เชธเชฎเชฏเชฎเชพเช‚ เช•เซเชฐเซ‡เชถเชจเซ‡ เชŸเซเชฐเซ…เช• เช•เชฐเชตเชพเชฎเชพเช‚ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เช เซ€เช• เช•เชฐเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเซ‡ เช›เซ‡. เชญเซ‚เชฒเชถเซ‹ เชจเชนเซ€เช‚ เช•เซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชคเชฎเชจเซ‡ เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพ เชตเชงเชพเชฐเชตเชพ เช…เชจเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เช…เชจเซเชญเชตเชจเซ‡ เชธเซเชงเชพเชฐเชตเชพ เชฎเชพเชŸเซ‡ เชชเชฃ เชชเชฐเชตเชพเชจเช—เซ€ เช†เชชเซ‡ เช›เซ‡. เชธเช‚เชคเซเชฐเซ€ เชœเชพเชตเชพเชธเซเช•เซเชฐเชฟเชชเซเชŸ, เชจเซ‹เชก, เชชเชพเชฏเชฅเซ‹เชจ, PHP, เชฐเซ‚เชฌเซ€, เชœเชพเชตเชพ เช…เชจเซ‡ เช…เชจเซเชฏ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชญเชพเชทเชพเช“เชจเซ‡ เชธเชชเซ‹เชฐเซเชŸ เช•เชฐเซ‡ เช›เซ‡.

เชธเช‚เชคเซเชฐเซ€ เชธเชพเชฅเซ‡ เชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชฎเชพเช‚ เชŸเซเชฐเซ…เช•เชฟเช‚เช— เชญเซ‚เชฒเซ‹

2. เชฒเซ‹เช—เชฟเชจ เช•เชฐเซ‹ เช…เชจเซ‡ เชเช• เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฌเชจเชพเชตเซ‹

  • เชคเชฎเชพเชฐเซเช‚ เชธเช‚เชคเซเชฐเซ€ เช–เชพเชคเซเช‚ เช–เซ‹เชฒเซ‹. เชคเชฎเชพเชฐเซ‡ เชธเชพเช‡เชจ เช‡เชจ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเซ€ เชถเช•เซ‡ เช›เซ‡. (เช•เซƒเชชเชพ เช•เชฐเซ€เชจเซ‡ เชจเซ‹เช‚เชง เช•เชฐเซ‹ เช•เซ‡ เชธเซ‡เชจเซเชŸเซเชฐเซ€ เชคเชฎเชพเชฐเชพ เชธเชฐเซเชตเชฐเซเชธ เชชเชฐ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡)
  • เช†เช—เชณเชจเซเช‚ เชชเช—เชฒเซเช‚ เช เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฌเชจเชพเชตเชตเชพเชจเซเช‚ เช›เซ‡
  • เชธเซ‚เชšเชฟเชฎเชพเช‚เชฅเซ€ เชคเชฎเชพเชฐเซ€ เชญเชพเชทเชพ เชชเชธเช‚เชฆ เช•เชฐเซ‹. (เช…เชฎเซ‡ เชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เชชเชธเช‚เชฆ เช•เชฐเชตเชพ เชœเชˆ เชฐเชนเซเชฏเชพ เช›เซ€เช. "เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฌเชจเชพเชตเซ‹" เชชเชฐ เช•เซเชฒเชฟเช• เช•เชฐเซ‹)

เชธเช‚เชคเซเชฐเซ€ เชธเชพเชฅเซ‡ เชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชฎเชพเช‚ เชŸเซเชฐเซ…เช•เชฟเช‚เช— เชญเซ‚เชฒเซ‹

เชคเชฎเชพเชฐเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชธเซ‡เชŸ เช•เชฐเซ‹. เชคเชฎเซ‡ เชจเซ€เชšเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐเชฎเชพเช‚ เชธเช‚เชคเซเชฐเซ€เชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชเช•เซ€เช•เซƒเชค เช•เชฐเชตเซเช‚ เชคเซ‡เชจเซเช‚ เชฎเซ‚เชณเชญเซ‚เชค เช‰เชฆเชพเชนเชฐเชฃ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹:

import * as Sentry from '@sentry/browser';
// Sentry.init({
//  dsn: "<https://[email protected]/1432138>"
// });
// should have been called before using it here
// ideally before even rendering your react app 

class ExampleBoundary extends Component {
    constructor(props) {
        super(props);
        this.state = { error: null };
    }

    componentDidCatch(error, errorInfo) {
      this.setState({ error });
      Sentry.withScope(scope => {
        Object.keys(errorInfo).forEach(key => {
          scope.setExtra(key, errorInfo[key]);
        });
        Sentry.captureException(error);
      });
    }

    render() {
        if (this.state.error) {
            //render fallback UI
            return (
              <a onClick={() => Sentry.showReportDialog()}>Report feedback</a>
            );
        } else {
            //when there's not an error, render children untouched
            return this.props.children;
        }
    }
}

เชคเชฎเชพเชฐเซ‡ เช†เช—เชณ เชถเซเช‚ เช•เชฐเชตเซเช‚ เชœเซ‹เชˆเช เชคเซ‡ เชธเชฎเชœเชตเชพ เชฎเชพเชŸเซ‡ เชธเซ‡เชจเซเชŸเซเชฐเซ€ เชชเชพเชธเซ‡ เชฎเชฆเชฆเชฐเซ‚เชช เชตเชฟเชเชพเชฐเซเชก เช›เซ‡. เชคเชฎเซ‡ เชจเซ€เชšเซ‡เชจเชพ เชชเช—เชฒเชพเช‚เชจเซ‡ เช…เชจเซเชธเชฐเซ€ เชถเช•เซ‹ เช›เซ‹. เชนเซเช‚ เชคเชฎเชจเซ‡ เชฌเชคเชพเชตเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚ เช•เซ‡ เชคเชฎเชพเชฐเซเช‚ เชชเซเชฐเชฅเชฎ เชเชฐเชฐ เชนเซ‡เชจเซเชกเชฒเชฐ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฌเชจเชพเชตเชตเซเช‚. เชธเชฐเชธ, เช…เชฎเซ‡ เชเช• เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฌเชจเชพเชตเซเชฏเซ‹ เช›เซ‡! เชšเชพเชฒเซ‹ เช†เช—เชณเชจเชพ เชชเช—เชฒเชพ เชชเชฐ เช†เช—เชณ เชตเชงเซ€เช

3. เชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เช…เชจเซ‡ เชธเช‚เชคเซเชฐเซ€ เชเช•เซ€เช•เชฐเชฃ

เชคเชฎเชพเชฐเซ‡ เชคเชฎเชพเชฐเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชฎเชพเช‚ npm เชชเซ‡เช•เซ‡เชœ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเซเช‚ เช†เชตเชถเซเชฏเช• เช›เซ‡.

npm i @sentry/browser

เชคเชฎเชพเชฐเชพ เช•เชจเซเชŸเซ‡เชจเชฐเชฎเชพเช‚ เชธเช‚เชคเซเชฐเซ€ เชถเชฐเซ‚ เช•เชฐเซ‹:

Sentry.init({
 // dsn: #dsnUrl,
});

DSN เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเซเชธ -> เชธเซ‡เชŸเชฟเช‚เช—เซเชธ -> เช•เซเชฒเชพเชฏเชจเซเชŸ เช•เซ€เชฎเชพเช‚ เชธเซเชฅเชฟเชค เช›เซ‡. เชคเชฎเซ‡ เชธเชฐเซเชš เชฌเชพเชฐเชฎเชพเช‚ เช•เซเชฒเชพเชฏเช‚เชŸ เช•เซ€เช เชถเซ‹เชงเซ€ เชถเช•เซ‹ เช›เซ‹.

เชธเช‚เชคเซเชฐเซ€ เชธเชพเชฅเซ‡ เชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชฎเชพเช‚ เชŸเซเชฐเซ…เช•เชฟเช‚เช— เชญเซ‚เชฒเซ‹

componentDidCatch(error, errorInfo) {
  Sentry.withScope(scope => {
    Object.keys(errorInfo).forEach(key => {
      scope.setExtra(key, errorInfo[key]);
    });
    Sentry.captureException(error);
 });
}

4. เชชเซเชฐเชฅเชฎ เชญเซ‚เชฒ เชŸเซเชฐเซ‡เช•เชฟเช‚เช—

เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชฎเซ‡เช‚ เชกเซ€เชเชฐ API เชธเชพเชฅเซ‡ เชเช• เชธเชฐเชณ เชธเช‚เช—เซ€เชค เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเชฏเซ‹. เชคเชฎเซ‡ เชคเซ‡เชจเซ‡ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹ เช…เชนเซ€เช‚. เช†เชชเชฃเซ‡ เชเช• เชญเซ‚เชฒ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชเช• เชฐเซ€เชค เช เช›เซ‡ เช•เซ‡ "เช…เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค" เชฎเชฟเชฒเช•เชคเชจเซ‡ เชเช•เซเชธเซ‡เชธ เช•เชฐเชตเซ€

เช†เชชเชฃเซ‡ เชเช• เชฌเชŸเชจ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เชœเซ‡ เช•เซ‰เชฒ เช•เชฐเซ‡ เช›เซ‡ เช•เชจเซเชธเซ‹เชฒ เชฒเซ‹เช— ั user.email. เช† เช•เซเชฐเชฟเชฏเชพ เชชเช›เซ€ เช…เชฎเชจเซ‡ เชเช• เชญเซ‚เชฒ เชธเช‚เชฆเซ‡เชถ เชชเซเชฐเชพเชชเซเชค เชฅเชตเซ‹ เชœเซ‹เชˆเช: เชจ เชชเช•เชกเชพเชฏเซ‡เชฒ TypeError (เช…เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เชฎเชพเช‚เชฅเซ€ เชฎเชฟเชฒเช•เชค เชตเชพเช‚เชšเซ€ เชถเช•เชพเชคเซ€ เชจเชฅเซ€ email) เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชชเชฆเชพเชฐเซเชฅเชจเซ€ เช—เซ‡เชฐเชนเชพเชœเชฐเซ€เชจเซ‡ เช•เชพเชฐเชฃเซ‡. เชคเชฎเซ‡ เชชเชฃ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เชœเชพเชตเชพเชธเซเช•เซเชฐเชฟเชชเซเชŸ เช…เชชเชตเชพเชฆ.

<button type="button" onClick={() => console.log(user.email)}>   
  Test Error button 
</button>

เช†เช–เซเช‚ เช•เชจเซเชŸเซ‡เชจเชฐ เช†เชจเชพ เชœเซ‡เชตเซเช‚ เชฒเชพเช—เซ‡ เช›เซ‡:

import React, { Component } from "react";
import { connect } from "react-redux";
import { Input, List, Skeleton, Avatar } from "antd";
import * as Sentry from "@sentry/browser";
import getList from "../store/actions/getList";

const Search = Input.Search;

const mapState = state => ({
  list: state.root.list,
  loading: state.root.loading
});

const mapDispatch = {
  getList
};

class Container extends Component {
  constructor(props) {
    super(props);

    Sentry.init({
      dsn: "https://[email protected]/1417586",
    });
  }

  componentDidCatch(error, errorInfo) {
    Sentry.withScope(scope => {
      Object.keys(errorInfo).forEach(key => {
        scope.setExtra(key, errorInfo[key]);
      });
      Sentry.captureException(error);
    });
  }
  render() {
    const { list, loading, getList } = this.props;
    const user = undefined;
    return (
      <div className="App">
        <button
          type="button"
          onClick={() => console.log(user.email)}
        >
          test error1
        </button>
        <div onClick={() => Sentry.showReportDialog()}>Report feedback1</div>
        <h1>Music Finder</h1>
        <br />
        <Search onSearch={value => getList(value)} enterButton />
        {loading && <Skeleton avatar title={false} loading={true} active />}
        {!loading && (
          <List
            itemLayout="horizontal"
            dataSource={list}
            locale={{ emptyText: <div /> }}
            renderItem={item => (
              <List.Item>
                <List.Item.Meta
                  avatar={<Avatar src={item.artist.picture} />}
                  title={item.title}
                  description={item.artist.name}
                />
              </List.Item>
            )}
          />
        )}
      </div>
    );
  }
}

export default connect(
  mapState,
  mapDispatch
)(Container);

เช† เชฌเชŸเชจเชจเซ‡ เชเช•เซ€เช•เซƒเชค เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชคเชฎเชพเชฐเซ‡ เชฌเซเชฐเชพเช‰เชเชฐเชฎเชพเช‚ เชคเซ‡เชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเชตเซเช‚ เชœเซ‹เชˆเช.

เชธเช‚เชคเซเชฐเซ€ เชธเชพเชฅเซ‡ เชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชฎเชพเช‚ เชŸเซเชฐเซ…เช•เชฟเช‚เช— เชญเซ‚เชฒเซ‹

เช…เชฎเชพเชฐเซ€ เชชเชนเซ‡เชฒเซ€ เชญเซ‚เชฒ เช›เซ‡

เชธเช‚เชคเซเชฐเซ€ เชธเชพเชฅเซ‡ เชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชฎเชพเช‚ เชŸเซเชฐเซ…เช•เชฟเช‚เช— เชญเซ‚เชฒเซ‹

เชนเซ‚-เชนเซ‚!

เชธเช‚เชคเซเชฐเซ€ เชธเชพเชฅเซ‡ เชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชฎเชพเช‚ เชŸเซเชฐเซ…เช•เชฟเช‚เช— เชญเซ‚เชฒเซ‹

เชœเซ‹ เชคเชฎเซ‡ เชนเซ‡เชกเชฐ เชเชฐเชฐ เชชเชฐ เช•เซเชฒเชฟเช• เช•เชฐเซ‹ เช›เซ‹, เชคเซ‹ เชคเชฎเซ‡ เชธเซเชŸเซ‡เช• เชŸเซเชฐเซ‡เชธ เชœเซ‹เชถเซ‹.

เชธเช‚เชคเซเชฐเซ€ เชธเชพเชฅเซ‡ เชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชฎเชพเช‚ เชŸเซเชฐเซ…เช•เชฟเช‚เช— เชญเซ‚เชฒเซ‹

เชธเช‚เชฆเซ‡เชถเชพเช“ เช–เชฐเชพเชฌ เชฒเชพเช—เซ‡ เช›เซ‡. เช…เชฒเชฌเชคเซเชค, เช† เช•เซ‹เชก เช•เซเชฏเชพเช‚ เช›เซ‡ เชคเซ‡ เชธเชฎเชœเซเชฏเชพ เชตเชฟเชจเชพ เช…เชฎเซ‡ เชญเซ‚เชฒ เชธเช‚เชฆเซ‡เชถเชพเช“ เชœเซ‹เชฏเชพ เช›เซ‡. เชฎเซ‚เชณเชญเซ‚เชค เชฐเซ€เชคเซ‡ เชคเซ‡ ReactJS เชฎเชพเช‚ เชธเซเชคเซเชฐเซ‹เชค เชจเช•เชถเชพ เชตเชฟเชถเซ‡ เช›เซ‡ เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชฟเชค เชจเชฅเซ€.

เชนเซเช‚ เชธเซเชฐเซ‹เชค เชจเช•เชถเซ‹ เชธเซ‡เชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เชธเซ‚เชšเชจเชพเช“ เชชเชฃ เชชเซเชฐเชฆเชพเชจ เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚, เชชเชฐเช‚เชคเซ เชคเซ‡ เช† เชชเซ‹เชธเซเชŸเชจเซ‡ เชฎเชพเชฐเชพ เชนเซ‡เชคเซ เช•เชฐเชคเชพเช‚ เช˜เชฃเซ€ เชฒเชพเช‚เชฌเซ€ เชฌเชจเชพเชตเชถเซ‡.

เชคเชฎเซ‡ เช† เชตเชฟเชทเชฏเชจเซ‹ เช…เชญเซเชฏเชพเชธ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เช…เชนเซ€เช‚. เชœเซ‹ เชคเชฎเชจเซ‡ เช† เชฒเซ‡เช–เชฎเชพเช‚ เชฐเชธ เชนเซ‹เชฏ เชคเซ‹, เชฆเชฟเชฎเชฟเชคเซเชฐเซ€ เชจเซ‹เชเซ‡เชจเซเช•เซ‹ เชธเซเชคเซเชฐเซ‹เชค เชจเช•เชถเชพ เชเช•เซ€เช•เชฐเชฃ เชตเชฟเชถเซ‡เชจเซ‹ เชฌเซ€เชœเซ‹ เชญเชพเช— เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเชถเซ‡. เชคเซ‡เชฅเซ€ เชตเชงเซ เชชเชธเช‚เชฆ เชชเชฐ เช•เซเชฒเชฟเช• เช•เชฐเซ‹ เช…เชจเซ‡ เชธเชฌเซเชธเซเช•เซเชฐเชพเช‡เชฌ เช•เชฐเซ‹ เชฆเชฟเชฎเชฟเชคเซเชฐเซ€ เชจเซ‹เชเซ‡เชจเซเช•เซ‹เชฌเซ€เชœเซ‹ เชญเชพเช— เชšเซ‚เช•เชถเซ‹ เชจเชนเซ€เช‚.

5. เช‰เชชเชฏเซ‹เช— เชธเซ‡เชจเซเชŸเซเชฐเซ€ เช…เช‚เชคเชฟเชฎ เชฌเชฟเช‚เชฆเซ เชธเชพเชฅเซ‡ API

เชฌเชฐเชพเชฌเชฐ. เช…เชฎเซ‡ เช…เช—เชพเช‰เชจเชพ เชซเช•เชฐเชพเช“เชฎเชพเช‚ เชœเชพเชตเชพเชธเซเช•เซเชฐเชฟเชชเซเชŸ เช…เชชเชตเชพเชฆเชจเซ‡ เช†เชตเชฐเซ€ เชฒเซ€เชงเซ‹ เช›เซ‡. เชœเซ‹ เช•เซ‡, XHR เชญเซ‚เชฒเซ‹ เชธเชพเชฅเซ‡ เช†เชชเชฃเซ‡ เชถเซเช‚ เช•เชฐเซ€เช?

เชธเช‚เชคเซเชฐเซ€ เชชเชพเชธเซ‡ เช•เชธเซเชŸเชฎ เชเชฐเชฐ เชนเซ‡เชจเซเชกเชฒเชฟเช‚เช— เชชเชฃ เช›เซ‡. เชฎเซ‡เช‚ เชเชชเซ€เช†เชˆ เชญเซ‚เชฒเซ‹เชจเซ‡ เชŸเซเชฐเซ…เช• เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเชฏเซ‹.

Sentry.captureException(err)

เชคเชฎเซ‡ เชคเชฎเชพเชฐเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ, เช‡เชฎเซ‡เช‡เชฒ เชตเช—เซ‡เชฐเซ‡ เชฆเซเชตเชพเชฐเชพ เชฌเช— เชจเชพเชฎ, เชธเซเชคเชฐ, เชกเซ‡เชŸเชพ เช‰เชฎเซ‡เชฐเซ€ เชถเช•เซ‹ เช›เซ‹, เช…เชจเชจเซเชฏ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชกเซ‡เชŸเชพ เช•เชธเซเชŸเชฎเชพเช‡เช เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹.

superagent
  .get(`https://deezerdevs-deezer.p.rapidapi.com/search?q=${query}`)
  .set("X-RapidAPI-Key", #id_key)
  .end((err, response) => {
    if (err) {
      Sentry.configureScope(
        scope => scope
          .setUser({"email": "[email protected]"})
          .setLevel("Error")
      );
      return Sentry.captureException(err);
    }

    if (response) {
      return dispatch(setList(response.body.data));
    }
  });

เชนเซเช‚ เช•เซ‡เชš API เชฎเชพเชŸเซ‡ เชธเชพเชฎเชพเชจเซเชฏ เช•เชพเชฐเซเชฏเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚.

import * as Sentry from "@sentry/browser";

export const apiCatch = (error, getState) => {
  const store = getState();
  const storeStringify = JSON.stringify(store);
  const { root: { user: { email } } } = store;

  Sentry.configureScope(
    scope => scope
      .setLevel("Error")
      .setUser({ email })
      .setExtra("store", storeStringify)
  );
    // Sentry.showReportDialog(); - If you want get users feedback on error
  return Sentry.captureException(error);
};

เชคเชฎเชพเชฐเชพ api เช•เซ‰เชฒเชฎเชพเช‚ เช† เชซเช‚เช•เซเชถเชจเชจเซ‡ เช†เชฏเชพเชค เช•เชฐเซ‹.

export default query => (dispatch, getState) => {
  superagent
    .get(`https://deezerdevs-deezer.p.rapidapi.com/search?q=${query}`)
    .set("X-RapidAPI-Key", #id_key)
    .end((error, response) => {
      if (error) {
        return apiCatch(error, getState)
      }

      if (response) {
        return dispatch(setList(response.body.data));
      }
    });
};

เชšเชพเชฒเซ‹ เชชเชฆเซเชงเชคเชฟเช“ เชคเชชเชพเชธเซ€เช:

  • เชธเซ‡เชŸ เชฒเซ‡เชตเชฒ เชคเชฎเชจเซ‡ เชธเช‚เชคเซเชฐเซ€ เชกเซ‡เชถเชฌเซ‹เชฐเซเชกเชฎเชพเช‚ เชธเซเชคเชฐเชจเซ€ เชญเซ‚เชฒ เชฆเชพเช–เชฒ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡. เชคเซ‡เชฎเชพเช‚ เช—เซเชฃเชงเชฐเซเชฎเซ‹ เช›เซ‡ - 'เช˜เชพเชคเช•', 'เชญเซ‚เชฒ', 'เชšเซ‡เชคเชตเชฃเซ€', 'เชฒเซ‹เช—', 'เชฎเชพเชนเชฟเชคเซ€, 'เชกเชฟเชฌเช—', 'เช•เซเชฐเชฟเชŸเชฟเช•เชฒ').
  • เชธเซ‡เชŸ เชฏเซเชเชฐ เช•เซ‹เชˆเชชเชฃ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชกเซ‡เชŸเชพ (เช†เชˆเชกเซ€, เชˆเชฎเซ‡เชˆเชฒ เชธเชฐเชจเชพเชฎเซเช‚, เชšเซเช•เชตเชฃเซ€ เชฏเซ‹เชœเชจเชพ, เชตเช—เซ‡เชฐเซ‡) เชธเชพเชšเชตเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเซ‡ เช›เซ‡.
  • setExtra เชคเชฎเชจเซ‡ เชœเชฐเซ‚เชฐเซ€ เช•เซ‹เชˆเชชเชฃ เชกเซ‡เชŸเชพ เชธเซ‡เชŸ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชธเซเชŸเซ‹เชฐ.

เชœเซ‹ เชคเชฎเซ‡ เชฌเช— เชชเชฐ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชชเซเชฐเชคเชฟเชธเชพเชฆ เช‡เชšเซเช›เซ‹ เช›เซ‹, เชคเซ‹ เชคเชฎเชพเชฐเซ‡ showReportDialog เชซเช‚เช•เซเชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹ เชœเซ‹เชˆเช.

Sentry.showReportDialog();

เช‰เชชเชธเช‚เชนเชพเชฐ:

เช†เชœเซ‡ เช…เชฎเซ‡ เชธเช‚เชคเซเชฐเซ€เชจเซ‡ เชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชฎเชพเช‚ เชเช•เซ€เช•เซƒเชค เช•เชฐเชตเชพเชจเซ€ เชเช• เชฐเซ€เชคเชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเซเชฏเซเช‚ เช›เซ‡.

โ†’ เชฆเซเชตเชพเชฐเชพ เชŸเซ‡เชฒเชฟเช—เซเชฐเชพเชฎ เชšเซ‡เชŸ เชธเซ‡เชจเซเชŸเซเชฐเซ€

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹