ื˜ืจืึทืงื™ื ื’ ืขืจืจืึธืจืก ืื™ืŸ ืึท ืจืขืึทืงื˜ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื ื™ืฆืŸ Sentry

ื˜ืจืึทืงื™ื ื’ ืขืจืจืึธืจืก ืื™ืŸ ืึท ืจืขืึทืงื˜ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื ื™ืฆืŸ Sentry

ื”ื™ื™ึทื ื˜ ืื™ืš ื•ื•ืขื˜ ื–ืึธื’ืŸ ืื™ืจ ื•ื•ืขื’ืŸ ืคืึทืงื˜ื™ืฉ-ืฆื™ื™ื˜ ื˜ืขื•ืช ื˜ืจืึทืงื™ื ื’ ืื™ืŸ ืึท ืจืขืึทืงื˜ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ. ื ืคืจืึธื ื˜-ืกื•ืฃ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืื™ื– ื ื™ืฉื˜ ื˜ื™ืคึผื™ืงืœื™ ื’ืขื ื™ืฆื˜ ืคึฟืึทืจ ื˜ืขื•ืช ื˜ืจืึทืงื™ื ื’. ืขื˜ืœืขื›ืข ืงืึธืžืคึผืึทื ื™ืขืก ืึธืคื˜ ืฉื˜ืขืœืŸ ืึทื•ื•ืขืง ื–ืฉื•ืง ื˜ืจืึทืงื™ื ื’, ืฆื•ืจื™ืงืงื•ืžืขืŸ ืฆื• ืขืก ื ืึธืš ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ, ื˜ืขืกืฅ, ืืื–"ื• ื•. ืึธื‘ืขืจ, ืื•ื™ื‘ ืื™ืจ ืงืขื ืขืŸ ื˜ื•ื™ืฉืŸ ื“ื™ื™ืŸ ืคึผืจืึธื“ื•ืงื˜ ืคึฟืึทืจ ื“ื™ ื‘ืขืกืขืจ, ื ืึธืจ ื˜ืึธืŸ ื“ืึธืก!

1. ืคืืจื•ื•ืืก ื˜ืึธืŸ ืื™ืจ ื“ืึทืจืคึฟืŸ ืกืขื ื˜ืจื™?

ืื™ืš ื™ื‘ืขืจื ืขืžืขืŸ ืื™ืจ ื–ืขื ื˜ ืื™ื ื˜ืขืจืขืกื™ืจื˜ ืื™ืŸ ื˜ืจืึทืงื™ื ื’ ื‘ืึทื’ื– ื‘ืขืฉืึทืก ืคึผืจืึธื“ื•ืงืฆื™ืข

ืฆื™ ืื™ืจ ื˜ืจืึทื›ื˜ืŸ ื“ืึธืก ืื™ื– ื ื™ืฉื˜ ื’ืขื ื•ื’?

ืึธื•ืงื™ื™, ืœืึธืžื™ืจ ืงื•ืงืŸ ืื™ืŸ ื“ื™ ืคืจื˜ื™ื.

ื“ื™ ื”ื•ื™ืคึผื˜ ืกื™ื‘ื•ืช ืคึฟืึทืจ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ืฆื• ื ื•ืฆืŸ Sentry:

  • ืึทืœืึทื•ื– ืื™ืจ ืฆื• ื•ื™ืกืžื™ื™ื“ืŸ ืจื™ืกืงืก ื•ื•ืขืŸ ื“ื™ืคึผืœื•ื™ื™ื ื’ ืงืึธื“ ืžื™ื˜ ืขืจืจืึธืจืก
  • ื”ื™ืœืฃ QA ืžื™ื˜ ืงืึธื“ ื˜ืขืกื˜ื™ื ื’
  • ื‘ืึทืงื•ืžืขืŸ ืฉื ืขืœ ื ืึธื•ื˜ืึทืคืึทืงื™ื™ืฉืึทื ื– ื•ื•ืขื’ืŸ ืคึผืจืึธื‘ืœืขืžืก
  • ืคื™ื™ื™ืงื™ื™ื˜ ืฆื• ื’ืขืฉื•ื•ื™ื ื“ ืคืึทืจืจื™ื›ื˜ืŸ ืขืจืจืึธืจืก
  • ื‘ืึทืงื•ืžืขืŸ ืึท ื‘ืึทืงื•ื•ืขื ื•ื•ื™ื™ึทื– ืคื•ืŸ ืขืจืจืึธืจืก ืื™ืŸ ื“ื™ ืึทื“ืžื™ืŸ ื˜ืึทืคืœื™ืข
  • ืกืึธืจื˜ ืขืจืจืึธืจืก ื“ื•ืจืš ื‘ืึทื ื™ืฆืขืจ / ื‘ืœืขื˜ืขืจืขืจ ืึธืคึผืฉื ื™ื˜

ื”ื•ื™ืคึผื˜ ืกื™ื‘ื•ืช ืคึฟืึทืจ ืกืขืึธ / ืคื™ืจืŸ ืคึผืจื•ื™ืขืงื˜

  • ืฉืคึผืึธืจืŸ ื’ืขืœื˜ (ืกืขื ื˜ืจื™ ืงืขื ืขืŸ ื–ื™ื™ืŸ ืื™ื ืกื˜ืึทืœื™ืจืŸ ืื•ื™ืฃ ื“ื™ื™ืŸ ืกืขืจื•ื•ืขืจืก)
  • ื‘ืึทืงื•ืžืขืŸ ื‘ืึทื ื™ืฆืขืจ ื‘ืึทืžืขืจืงื•ื ื’ืขืŸ
  • ืคึฟืึทืจืฉื˜ื™ื™ืŸ ื•ื•ืึธืก ืื™ื– ืคืึทืœืฉ ืžื™ื˜ ื“ื™ื™ืŸ ืคึผืจื•ื™ืขืงื˜ ืื™ืŸ ืคืึทืงื˜ื™ืฉ ืฆื™ื™ื˜
  • ืคืืจืฉื˜ืื ื“ ื“ื™ ื ื•ืžืขืจ ืคื•ืŸ ืคึผืจืึธื‘ืœืขืžืก ืžืขื ื˜ืฉืŸ ื”ืึธื‘ืŸ ืžื™ื˜ ื“ื™ื™ืŸ ืึทืคึผ
  • ื”ื™ืœืฃ ืื™ืจ ื’ืขืคึฟื™ื ืขืŸ ืขืจื˜ืขืจ ื•ื•ื• ื“ื™ื™ืŸ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ื’ืขืžืื›ื˜ ืžื™ืกื˜ื™ื™ืงืก

ืื™ืš ื˜ืจืึทื›ื˜ืŸ ื“ื™ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ื•ื•ืึธืœื˜ ื–ื™ื™ืŸ ืื™ื ื˜ืขืจืขืกื™ืจื˜ ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ืขืจืฉื˜ืขืจ. ืื™ืจ ืงืขื ื˜ ืื•ื™ืš ื ื•ืฆืŸ ื“ื™ ืจืฉื™ืžื” ืคื•ืŸ ืกื™ื‘ื•ืช ืฆื• ืื™ื‘ืขืจืฆื™ื™ื’ืŸ ื“ื™ื™ืŸ ื‘ืึธืกืกืขืก ืฆื• ื•ื™ืกืฉื˜ื™ืžืขืŸ ืกืขื ื˜ืจื™.

ื–ื™ื™ืŸ ืึธืคึผื’ืขื”ื™ื˜ ืžื™ื˜ ื“ื™ ืœืขืฆื˜ืข ื ื•ืžืขืจ ืื•ื™ืฃ ื“ื™ ื’ืขืฉืขืคื˜ ืจืฉื™ืžื”.

ื–ืขื ื˜ ืื™ืจ ืฉื•ื™ืŸ ืื™ื ื˜ืขืจืขืกื™ืจื˜?

ื˜ืจืึทืงื™ื ื’ ืขืจืจืึธืจืก ืื™ืŸ ืึท ืจืขืึทืงื˜ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื ื™ืฆืŸ Sentry

ื•ื•ืึธืก ืื™ื– ืกืขื ื˜ืจื™?

Sentry ืื™ื– ืึทืŸ ืึธืคึฟืŸ ืžืงื•ืจ ื–ืฉื•ืง ื˜ืจืึทืงื™ื ื’ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืึทื– ื”ืขืœืคึผืก ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ืฆื• ืฉืคึผื•ืจ ืื•ืŸ ืคืึทืจืจื™ื›ื˜ืŸ ืงืจืึทืฉื™ื– ืื™ืŸ ืคืึทืงื˜ื™ืฉ ืฆื™ื™ื˜. ื“ื• ื–ืืœืกื˜ ื ื™ืฉื˜ ืคืึทืจื’ืขืกืŸ ืึทื– ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืึทืœืึทื•ื– ืื™ืจ ืฆื• ืคืึทืจื’ืจืขืกืขืจืŸ ืขืคืขืงื˜ื™ื•ื•ืงื™ื™ึทื˜ ืื•ืŸ ืคึฟืึทืจื‘ืขืกืขืจืŸ ื‘ืึทื ื™ืฆืขืจ ื“ืขืจืคืึทืจื•ื ื’. ืกืขื ื˜ืจื™ ืฉื˜ื™ืฆื˜ ื“ื–ืฉืึทื•ื•ืึทืกืงืจื™ืคึผื˜, ื ืึธื“ืข, ืคึผื™ื˜ื”ืึธืŸ, ืคืคึผ, ืจื•ื‘ื™, ื–'ืื‘ื ืื•ืŸ ืื ื“ืขืจืข ืคึผืจืึธื’ืจืึทืžืžื™ื ื’ ืฉืคึผืจืึทื›ืŸ.

ื˜ืจืึทืงื™ื ื’ ืขืจืจืึธืจืก ืื™ืŸ ืึท ืจืขืึทืงื˜ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื ื™ืฆืŸ Sentry

2. ืœืึธื’ื™ืŸ ืื•ืŸ ืฉืึทืคึฟืŸ ืึท ืคึผืจื•ื™ืขืงื˜

  • ืขืคึฟืขื ืขืŸ ื“ื™ื™ืŸ ืกืขื ื˜ืจื™ ื—ืฉื‘ื•ืŸ. ืื™ืจ ืงืขืŸ ื”ืึธื‘ืŸ ืฆื• ืงืœืึธืฅ ืื™ืŸ. (ื‘ื™ื˜ืข ื˜ืึธืŸ ืึทื– ืกืขื ื˜ืจื™ ืงืขื ืขืŸ ื–ื™ื™ืŸ ืื™ื ืกื˜ืึทืœื™ืจืŸ ืื•ื™ืฃ ื“ื™ื™ืŸ ืกืขืจื•ื•ืขืจืก)
  • ื“ืขืจ ื•ื•ื™ื™ึทื˜ืขืจ ืฉืจื™ื˜ ืื™ื– ืฆื• ืฉืึทืคึฟืŸ ืึท ืคึผืจื•ื™ืขืงื˜
  • ืื•ื™ืกืงืœื™ื™ึทื‘ืŸ ื“ื™ื™ืŸ ืฉืคึผืจืึทืš ืคื•ืŸ ื“ืขืจ ืจืฉื™ืžื”. (ืžื™ืจ ื•ื•ืขืœืŸ ืื•ื™ืกืงืœื™ื™ึทื‘ืŸ ืจืขืึทืงื˜. ื“ืจื™ืงื˜ "ืฉืึทืคึฟืŸ ืคึผืจืึธื™ืขืงื˜")

ื˜ืจืึทืงื™ื ื’ ืขืจืจืึธืจืก ืื™ืŸ ืึท ืจืขืึทืงื˜ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื ื™ืฆืŸ Sentry

ืงืึทืกื˜ืึทืžื™ื™ื– ื“ื™ื™ืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ. ื ื™ืงืขืจื“ื™ืง ื‘ื™ื™ึทืฉืคึผื™ืœ ืคื•ืŸ ื•ื•ื™ ืฆื• ื•ื™ืกืฉื˜ื™ืžืขืŸ ืกืขื ื˜ืจื™ ืื™ืŸ ืึท ืงืึทื ื˜ื™ื™ื ืขืจ ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขื–ืขืŸ ืื•ื ื˜ืŸ:

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;
        }
    }
}

Sentry ื”ืื˜ ืึท ื ื•ืฆื™ืง ื•ื•ื™ื–ืขืจื“ ืฆื• ื”ืขืœืคืŸ ืื™ืจ ื’ืขืคึฟื™ื ืขืŸ ื•ื•ืึธืก ืื™ืจ ื–ืึธืœ ื˜ืึธืŸ ื•ื•ื™ื™ึทื˜ืขืจ. ืื™ืจ ืงืขื ืขืŸ ื ืึธื›ื’ื™ื™ืŸ ื“ื™ ืกื˜ืขืคึผืก. ืื™ืš ื•ื•ื™ืœืŸ ืฆื• ื•ื•ื™ื™ึทื–ืŸ ืื™ืจ ื•ื•ื™ ืฆื• ืฉืึทืคึฟืŸ ื“ื™ื™ืŸ ืขืจืฉื˜ืขืจ ื˜ืขื•ืช ื”ืึทื ื“ืœืขืจ. ื’ืจื•ื™ืก, ืžื™ืจ ื”ืึธื‘ืŸ ื‘ืืฉืืคืŸ ืึท ืคึผืจื•ื™ืขืงื˜! ื–ืืœ ืก ืžืึทืš ืื•ื™ืฃ ืฆื• ื“ื™ ื•ื•ื™ื™ึทื˜ืขืจ ืฉืจื™ื˜

3. ืจืขืึทื’ื™ืจืŸ ืื•ืŸ ืกืขื ื˜ืจื™ ื™ื ื˜ืึทื’ืจื™ื™ืฉืึทืŸ

ืื™ืจ ืžื•ื–ืŸ ื™ื ืกื˜ืึทืœื™ืจืŸ ื“ื™ npm ืคึผืขืงืœ ืื™ืŸ ื“ื™ื™ืŸ ืคึผืจื•ื™ืขืงื˜.

npm i @sentry/browser

ื™ื ื™ืฉืึทืœื™ื–ืข ืกืขื ื˜ืจื™ ืื™ืŸ ื“ื™ื™ืŸ ืงืึทื ื˜ื™ื™ื ืขืจ:

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

ื“ื™ DSN ืื™ื– ืœื™ื’ืŸ ืื™ืŸ ืคึผืจืึทื“ื–ืฉืขืงืก -> ืกืขื˜ื˜ื™ื ื’ืก -> ืงืœื™ืขื ื˜ ืงื™ื–. ืื™ืจ ืงืขื ืขืŸ ื’ืขืคึฟื™ื ืขืŸ ืงืœื™ืขื ื˜ ืฉืœื™ืกืœืขืŸ ืื™ืŸ ื“ื™ ื–ื•ื›ืŸ ื‘ืึทืจ.

ื˜ืจืึทืงื™ื ื’ ืขืจืจืึธืจืก ืื™ืŸ ืึท ืจืขืึทืงื˜ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื ื™ืฆืŸ Sentry

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

4. ื˜ืจืึทืงื™ื ื’ ื“ืขืจ ืขืจืฉื˜ืขืจ ื˜ืขื•ืช

ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ืื™ืš ื’ืขื•ื•ื™ื™ื ื˜ ืึท ืคึผืฉื•ื˜ ืžื•ื–ื™ืง ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืžื™ื˜ ื“ื™ Deezer API. ืื™ืจ ืงืขื ืขืŸ ื–ืขืŸ ืขืก ื“ืึธ. ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืฉืึทืคึฟืŸ ืึท ื˜ืขื•ืช. ืื™ื™ืŸ ื•ื•ืขื’ ืื™ื– ืฆื• ืึทืงืกืขืก ื“ื™ "ื•ื ื“ืขืคื™ื ืขื“" ืคืึทืจืžืึธื’

ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืฉืึทืคึฟืŸ ืึท ืงื ืขืคึผืœ ื•ื•ืึธืก ืจื•ืคื˜ console.log ั ื‘ืึทื ื™ืฆืขืจ.ืขืžืึทื™ืœ. ื ืึธืš ื“ืขื ืงืึทืžืฃ ืžื™ืจ ื–ืึธืœ ื‘ืึทืงื•ืžืขืŸ ืึท ื˜ืขื•ืช ืึธื ื–ืึธื’: Uncaught TypeError (ืงืขื ืขืŸ ื ื™ื˜ ืœื™ื™ืขื ืขืŸ ืคืึทืจืžืึธื’ ืคื•ืŸ ืึทื ื“ื™ืคื™ื™ื ื“ email) ืจืขื›ื˜ ืฆื• ืคืขืœื ื“ื™ืง ื‘ืึทื ื™ืฆืขืจ ื›ื™ื™ืคืขืฅ. ืื™ืจ ืงืขื ืขืŸ ืื•ื™ืš ื ื•ืฆืŸ Javascript ื•ื™ืกื ืขื.

<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);

ื ืึธืš ื™ื ื˜ืึทื’ืจื™ื™ื˜ื™ื ื’ ื“ืขื ืงื ืขืคึผืœ, ืื™ืจ ื–ืึธืœ ืคึผืจื•ื‘ื™ืจืŸ ืขืก ืื™ืŸ ื“ืขื ื‘ืœืขื˜ืขืจืขืจ.

ื˜ืจืึทืงื™ื ื’ ืขืจืจืึธืจืก ืื™ืŸ ืึท ืจืขืึทืงื˜ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื ื™ืฆืŸ Sentry

ืžื™ืจ ื”ืึธื‘ืŸ ืื•ื ื“ื–ืขืจ ืขืจืฉื˜ืขืจ ื˜ืขื•ืช

ื˜ืจืึทืงื™ื ื’ ืขืจืจืึธืจืก ืื™ืŸ ืึท ืจืขืึทืงื˜ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื ื™ืฆืŸ Sentry

ื•ื•ืื•-ื”ื•!

ื˜ืจืึทืงื™ื ื’ ืขืจืจืึธืจืก ืื™ืŸ ืึท ืจืขืึทืงื˜ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื ื™ืฆืŸ Sentry

ืื•ื™ื‘ ืื™ืจ ื’ื™ื˜ ืื•ื™ืฃ ื“ื™ ื›ืขื“ืขืจ ื˜ืขื•ืช, ืื™ืจ ื•ื•ืขื˜ ื–ืขืŸ ืึท ืึธื ืœื™ื™ื’ืŸ ืฉืคึผื•ืจ.

ื˜ืจืึทืงื™ื ื’ ืขืจืจืึธืจืก ืื™ืŸ ืึท ืจืขืึทืงื˜ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื ื™ืฆืŸ Sentry

ื“ื™ ืึทืจื˜ื™ืงืœืขืŸ ืงื•ืงืŸ ืฉืœืขื›ื˜. ื“ืึธืš ืžื™ืจ ื”ืึธื‘ืŸ ื’ืขื–ืขืŸ ื˜ืขื•ืช ืึทืจื˜ื™ืงืœืขืŸ ืึธืŸ ืคืืจืฉื˜ืื ื“ ื•ื•ื• ื“ื™ ืงืึธื“ ืื™ื–. ื“ื•ืจืš ืคืขืœื™ืงื™ื™ึทื˜ ืžื™ืจ ื–ืขื ืขืŸ ื’ืขืจืขื“ื˜ ื•ื•ืขื’ืŸ ื“ื™ ืžืงื•ืจ ืžืึทืคึผืข ืื™ืŸ ReactJS ื•ื•ื™ื™ึทืœ ื–ื™ื™ ื–ืขื ืขืŸ ื ื™ืฉื˜ ืงืึทื ืคื™ื’ื™ืขืจื“.

ืื™ืš ื•ื•ืึธืœื˜ ืื•ื™ืš ื•ื•ื™ ืฆื• ืฆื•ืฉื˜ืขืœืŸ ื™ื ืกื˜ืจืึทืงืฉืึทื ื– ืคึฟืึทืจ ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ื“ื™ ืžืงื•ืจ ืžืึทืคึผืข, ืึธื‘ืขืจ ื“ืึธืก ื•ื•ืึธืœื˜ ืžืึทื›ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ืคื™ืœ ืžืขืจ ื•ื•ื™ ืื™ืš ื‘ื“ืขื”.

ืื™ืจ ืงืขื ืขืŸ ืœืขืจื ืขืŸ ื“ืขื ื˜ืขืžืข ื“ืึธ. ืื•ื™ื‘ ืื™ืจ ื–ืขื ื˜ ืื™ื ื˜ืขืจืขืกื™ืจื˜ ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ, ื“ืžื™ื˜ืจื™ ื ืึธื–ืฉืขื ืงืึธ ื•ื•ืขื˜ ืึทืจื•ื™ืกื’ืขื‘ืŸ ื“ื™ ืจื’ืข ื˜ื™ื™ืœ ื•ื•ืขื’ืŸ ืžืงื•ืจ ืžืึทืคึผืข ื™ื ื˜ืึทื’ืจื™ื™ืฉืึทืŸ. ืึทื–ื•ื™, ืฉืœืึธื’ืŸ ืžืขืจ ืœื™ื™ืงืก ืื•ืŸ ืึทื‘ืึธื ื™ืจืŸ ืฆื• ื“ืžื™ื˜ืจื™ ื ืึธื–ืฉืขื ืงืึธื›ื“ื™ ื ื™ืฉื˜ ืฆื• ืคืืจืคืขืœืŸ ื“ืขื ืฆื•ื•ื™ื™ื˜ืŸ ื˜ื™ื™ืœ.

ืงืกื ื•ืžืงืก. ื“ื™ ื ื•ืฆืŸ ืคื•ืŸ ื•ื•ืขื›ื˜ืขืจ ืžื™ื˜ ืกื•ืฃ ืคื•ื ื˜ ืึทืคึผื™

ืืงืขื™. ืžื™ืจ ื”ืึธื‘ืŸ ื‘ืื“ืขืงื˜ ื“ื™ ื•ื™ืกื ืขื ืคื•ืŸ ื“ื–ืฉืึทื•ื•ืึทืกืงืจื™ืคึผื˜ ืื™ืŸ ื“ื™ ืคืจื™ืขืจื“ื™ืงืข ืคึผืึทืจืึทื’ืจืึทืคืก. ืึธื‘ืขืจ, ื•ื•ืึธืก ื•ื•ืขืœืŸ ืžื™ืจ ื˜ืึธืŸ ื•ื•ืขื’ืŸ XHR ืขืจืจืึธืจืก?

ืกืขื ื˜ืจื™ ืื•ื™ืš ื”ืื˜ ืžื ื”ื’ ื˜ืขื•ืช ื”ืึทื ื“ืœื™ื ื’. ืื™ืš ื’ืขื•ื•ื™ื™ื ื˜ ืขืก ืฆื• ืฉืคึผื•ืจ ืึทืคึผื™ ืขืจืจืึธืจืก.

Sentry.captureException(err)

ืื™ืจ ืงืขื ืขืŸ ืงืึทืกื˜ืึทืžื™ื™ื– ื“ื™ ื˜ืขื•ืช ื ืึธืžืขืŸ, ืžื“ืจื’ื”, ืœื™ื™ื’ืŸ ื“ืึทื˜ืŸ, ื™ื™ื ืฆื™ืง ื‘ืึทื ื™ืฆืขืจ ื“ืึทื˜ืŸ ื ื™ืฆืŸ ื“ื™ื™ืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ, E- ื‘ืจื™ื•ื•, ืขื˜ืง.

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));
    }
  });

ืื™ืš ื•ื•ืึธืœื˜ ื•ื•ื™ ืฆื• ื ื•ืฆืŸ ืึท ื“ื–ืฉืึทื ืขืจื™ืง ืคึฟื•ื ืงืฆื™ืข ืคึฟืึทืจ ื“ื™ ื›ืึทืคึผืŸ ืึทืคึผื™.

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);
};

ืึทืจื™ื™ึทื ืคื™ืจ ื“ืขื ืคึฟื•ื ืงืฆื™ืข ืื™ืŸ ื“ื™ื™ืŸ ืึทืคึผื™ ืจื•ืคืŸ.

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));
      }
    });
};

ื–ืืœ ืก ืงืึธื ื˜ืจืึธืœื™ืจืŸ ื“ื™ ืžืขื˜ื”ืึธื“ืก:

  • setLevel ืึทืœืึทื•ื– ืื™ืจ ืฆื• ืึทืจื™ื™ึทื ืœื™ื™ื’ืŸ ืึท ืžื“ืจื’ื” ื˜ืขื•ืช ืื™ืŸ ื“ื™ ื•ื•ืขื›ื˜ืขืจ ื“ืึทืฉื‘ืึธืจื“. ืขืก ื”ืื˜ ืคึผืจืึธืคึผืขืจื˜ื™ืขืก - 'ืคืึทื˜ืึทืœ', 'ื˜ืขื•ืช', 'ื•ื•ืืจืขื ื•ื ื’', 'ืœืึธื’', 'ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข, 'ื“ื™ื‘ืึทื’', 'ืงืจื™ื˜ื™ืฉ').
  • setUser ื”ืขืœืคึผืก ืฆื• ืจืึทื˜ืขื•ื•ืขืŸ ืงื™ื™ืŸ ื‘ืึทื ื™ืฆืขืจ ื“ืึทื˜ืŸ (ืฉื™ื™ึทืŸ, ื‘ืœื™ืฆืคึผืึธืกื˜ ืึทื“ืจืขืก, ืฆืึธืœื•ื ื’ ืคึผืœืึทืŸ, ืืื–"ื• ื•).
  • setExtra ืึทืœืึทื•ื– ืื™ืจ ืฆื• ืกืคึผืขืฆื™ืคื™ืฆื™ืจืŸ ืงื™ื™ืŸ ื“ืึทื˜ืŸ ืื™ืจ ื“ืึทืจืคึฟืŸ, ืœืžืฉืœ, ืงืจืึธื.

ืื•ื™ื‘ ืื™ืจ ื•ื•ื™ืœืŸ ืฆื• ื‘ืึทืงื•ืžืขืŸ ื‘ืึทื ื™ืฆืขืจ ื‘ืึทืžืขืจืงื•ื ื’ืขืŸ ื•ื•ืขื’ืŸ ืึท ื–ืฉื•ืง, ืื™ืจ ื–ืึธืœ ื ื•ืฆืŸ ื“ื™ showReportDialog ืคื•ื ืงืฆื™ืข.

Sentry.showReportDialog();

ืžืกืงื ื:

ื”ื™ื™ึทื ื˜ ืžื™ืจ ื“ื™ืกืงืจื™ื™ื‘ื“ ืื™ื™ืŸ ื•ื•ืขื’ ืฆื• ื•ื™ืกืฉื˜ื™ืžืขืŸ ืกืขื ื˜ืจื™ ืื™ืŸ ืึท ืจืขืึทืงื˜ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ.

โ†’ ื˜ืขืœืขื’ืจืึทื ืฉืžื•ืขืกืŸ ื“ื•ืจืš ื•ื•ืขื›ื˜ืขืจ

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’