рдЖрдЬ рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рд░рд┐рдЕреЕрдХреНрдЯ рдНрдкреНрд▓рд┐рдХреЗрд╢рдирдордзреНрдпреЗ рд░рд┐рдЕрд▓-рдЯрд╛рдЗрдо рдПрд░рд░ рдЯреНрд░реЕрдХрд┐рдВрдЧрдмрджреНрджрд▓ рд╕рд╛рдВрдЧреЗрди. рдПрд░рд░ рдЯреНрд░реЕрдХрд┐рдВрдЧрд╕рд╛рдареА рдлреНрд░рдВрдЯ-рдПрдВрдб рдНрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд╛рдорд╛рдиреНрдпрдд: рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдд рдирд╛рд╣реА. рдХрд╛рд╣реА рдХрдВрдкрдиреНрдпрд╛ рдмрд░реНтАНрдпрд╛рдЪрджрд╛ рдмрдЧ рдЯреНрд░реЕрдХрд┐рдВрдЧ рдмрдВрдж рдареЗрд╡рддрд╛рдд, рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдг, рдЪрд╛рдЪрдгреНрдпрд╛ рдЗ. рдирдВрддрд░ рддреНрдпрд╛рдХрдбреЗ рдкрд░рдд рдпреЗрддрд╛рдд. рддрдерд╛рдкрд┐, рдЬрд░ рддреБрдореНрд╣реА рддреБрдордЪреЗ рдЙрддреНрдкрд╛рджрди рдЕрдзрд┐рдХ рдЪрд╛рдВрдЧрд▓реНрдпрд╛рд╕рд╛рдареА рдмрджрд▓реВ рд╢рдХрдд рдЕрд╕рд╛рд▓ рддрд░ рддреЗ рдХрд░рд╛!
1. рддреБрдореНрд╣рд╛рд▓рд╛ рд╕реЗрдВрдЯреНрд░реАрдЪреА рдЧрд░рдЬ рдХрд╛ рдЖрд╣реЗ?
рдореА рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░рддреЛ рдХреА рддреБрдореНрд╣рд╛рд▓рд╛ рдЙрддреНрдкрд╛рджрдирд╛рджрд░рдореНрдпрд╛рди рдмрдЧ рдЯреНрд░реЕрдХ рдХрд░рдгреНрдпрд╛рдд рд╕реНрд╡рд╛рд░рд╕реНрдп рдЖрд╣реЗ
рд╣реЗ рдкреБрд░реЗрд╕реЗ рдирд╛рд╣реА рдЕрд╕реЗ рддреБрдореНрд╣рд╛рд▓рд╛ рд╡рд╛рдЯрддреЗ рдХрд╛?
рдареАрдХ рдЖрд╣реЗ, рдЪрд▓рд╛ рддрдкрд╢реАрд▓ рдкрд╛рд╣реВ.
рд╡рд┐рдХрд╕рдХрд╛рдВрдиреА рд╕реЗрдВрдЯрд░реА рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреА рдкреНрд░рдореБрдЦ рдХрд╛рд░рдгреЗ:
- рддреНрд░реБрдЯреАрдВрд╕рд╣ рдХреЛрдб рдЙрдкрдпреЛрдЬрд┐рдд рдХрд░рддрд╛рдирд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рдЬреЛрдЦреАрдо рдЯрд╛рд│рдгреНрдпрд╛рдЪреА рдЕрдиреБрдорддреА рджреЗрддреЗ
- рдХреЛрдб рдЪрд╛рдЪрдгреАрд╕рд╣ QA рд▓рд╛ рдорджрдд рдХрд░рд╛
- рд╕рдорд╕реНрдпрд╛рдВрдмрджреНрджрд▓ рддреНрд╡рд░рд┐рдд рд╕реВрдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рд╛
- рддреНрд╡рд░реАрдд рдЪреБрдХрд╛ рджреБрд░реБрд╕реНрдд рдХрд░рдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛
- рдНрдбрдорд┐рди рдкреЕрдиреЗрд▓рдордзреАрд▓ рддреНрд░реБрдЯреАрдВрдЪреЗ рд╕реЛрдпреАрд╕реНрдХрд░ рдкреНрд░рджрд░реНрд╢рди рдорд┐рд│рд╡рдгреЗ
- рд╡рд╛рдкрд░рдХрд░реНрддрд╛/рдмреНрд░рд╛рдЙрдЭрд░ рд╡рд┐рднрд╛рдЧрд╛рдиреБрд╕рд╛рд░ рддреНрд░реБрдЯреАрдВрдЪреА рдХреНрд░рдорд╡рд╛рд░реА рд▓рд╛рд╡рд╛
рд╕реАрдИрдУ/рд▓реАрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯрдЪреА рдореБрдЦреНрдп рдХрд╛рд░рдгреЗ
- рдкреИрд╕реЗ рд╡рд╛рдЪрд╡рд╛ (рдЖрдкрд▓реНрдпрд╛ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рд╕реЗрдВрдЯреНрд░реА рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ)
- рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдЕрднрд┐рдкреНрд░рд╛рдп рдорд┐рд│рд╡рдд рдЖрд╣реЗ
- рд░рд┐рдЕрд▓ рдЯрд╛рдЗрдордордзреНрдпреЗ рдЖрдкрд▓реНрдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯрдордзреНрдпреЗ рдХрд╛рдп рдЪреВрдХ рдЖрд╣реЗ рд╣реЗ рд╕рдордЬреВрди рдШреЗрдгреЗ
- рддреБрдордЪреНрдпрд╛ рдЕреЕрдкрд╕рд╣ рд▓реЛрдХрд╛рдВрдирд╛ рдХрд┐рддреА рд╕рдорд╕реНрдпрд╛ рдпреЗрдд рдЖрд╣реЗрдд рд╣реЗ рд╕рдордЬреВрди рдШреЗрдгреЗ
- рддреБрдордЪреНрдпрд╛ рдбреЗрд╡реНрд╣рд▓рдкрд░реНрд╕рдиреА рдЬрд┐рдереЗ рдЪреБрдХрд╛ рдХреЗрд▓реНрдпрд╛ рддреНрдпрд╛ рдард┐рдХрд╛рдгреЗ рд╢реЛрдзрдгреНрдпрд╛рдд рддреБрдореНрд╣рд╛рд▓рд╛ рдорджрдд рдХрд░рд╛
рдорд▓рд╛ рд╡рд╛рдЯрддреЗ рдХреА рд╡рд┐рдХрд╛рд╕рдХрд╛рдВрдирд╛ рдкреНрд░рдердо рдпрд╛ рд▓реЗрдЦрд╛рдд рд░рд╕ рдЕрд╕реЗрд▓. рддреБрдореНрд╣реА рддреБрдордЪреНрдпрд╛ рдмреЙрд╕рд▓рд╛ рд╕реЗрдиреНрдЯреНрд░реА рд╕рдорд╛рдХрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкрдЯрд╡реВрди рджреЗрдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рд░рдгрд╛рдВрдЪреА рд╣реА рдпрд╛рджреА рджреЗрдЦреАрд▓ рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛.
рд╡реНрдпрд╡рд╕рд╛рдп рд╕реВрдЪреАрддреАрд▓ рд╢реЗрд╡рдЯрдЪреНрдпрд╛ рдЖрдпрдЯрдордЪреА рдХрд╛рд│рдЬреА рдШреНрдпрд╛.
рддреБрдореНрд╣рд╛рд▓рд╛ рдЖрдзреАрдЪ рд╕реНрд╡рд╛рд░рд╕реНрдп рдЖрд╣реЗ?
рд╕рдВрддрд░реА рдореНрд╣рдгрдЬреЗ рдХрд╛рдп?
рд╕реЗрдиреНрдЯреНрд░реА рд╣рд╛ рдПрдХ рдУрдкрди рд╕реЛрд░реНрд╕ рдмрдЧ рдЯреНрд░реЕрдХрд┐рдВрдЧ рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрд╣реЗ рдЬреЛ рдбреЗрд╡реНрд╣рд▓рдкрд░рдирд╛ рд░реАрдЕрд▓ рдЯрд╛рдЗрдордордзреНрдпреЗ рдХреНрд░реЕрд╢ рдЯреНрд░реЕрдХ рдХрд░рдгреНрдпрд╛рдд рдЖрдгрд┐ рддреНрдпрд╛рдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреНрдпрд╛рдд рдорджрдд рдХрд░рддреЛ. рд╣реЗ рд╡рд┐рд╕рд░реВ рдирдХрд╛ рдХреА рдЕрдиреБрдкреНрд░рдпреЛрдЧ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╡рд╛рдврд╡рд┐рдгреНрдпрд╛рд╕ рдЖрдгрд┐ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдЕрдиреБрднрд╡ рд╕реБрдзрд╛рд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЛ. рд╕реЗрдиреНрдЯреНрд░реА JavaScript, Node, Python, PHP, Ruby, Java рдЖрдгрд┐ рдЗрддрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдВрдирд╛ рд╕рдкреЛрд░реНрдЯ рдХрд░рддреЗ.
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 рд╕рд╣ рдПрдХ рд╕рд╛рдзрд╛ рд╕рдВрдЧреАрдд рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд╛рдкрд░рд▓рд╛. рдЖрдкрдг рддреЗ рдкрд╛рд╣реВ рд╢рдХрддрд╛
рдЖрдореНрд╣рд╛рд▓рд╛ рдХреЙрд▓ рдХрд░рдгрд╛рд░реЗ рдмрдЯрдг рддрдпрд╛рд░ рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓ console.log ╤Б user.email. рдпрд╛ рдХреНрд░рд┐рдпреЗрдирдВрддрд░ рдЖрдореНрд╣рд╛рд▓рд╛ рдПрдХ рддреНрд░реБрдЯреА рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдЭрд╛рд▓рд╛ рдкрд╛рд╣рд┐рдЬреЗ: рди рдкрдХрдбрд▓реЗрд▓реА 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);
рд╣реЗ рдмрдЯрдг рд╕рдорд╛рдХрд▓рд┐рдд рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рддреБрдореНрд╣реА рдмреНрд░рд╛рдЙрдЭрд░рдордзреНрдпреЗ рддреНрдпрд╛рдЪреА рдЪрд╛рдЪрдгреА рдШреНрдпрд╛рд╡реА.
рдЖрдордЪреА рдкрд╣рд┐рд▓реА рдЪреВрдХ рдЖрд╣реЗ
рд╣реВ-рд╣реВ!
рдЖрдкрдг рд╢реАрд░реНрд╖рд▓реЗрдЦ рддреНрд░реБрдЯреАрд╡рд░ рдХреНрд▓рд┐рдХ рдХреЗрд▓реНрдпрд╛рд╕, рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рд╕реНрдЯреЕрдХ рдЯреНрд░реЗрд╕ рджрд┐рд╕реЗрд▓.
рд╕рдВрджреЗрд╢ рд╡рд╛рдИрдЯ рджрд┐рд╕рдд рдЖрд╣реЗрдд. рдЕрд░реНрдерд╛рдд рдЖрдореНрд╣реА рдХреЛрдб рдХреБрдареЗ рдЖрд╣реЗ рд╣реЗ рд╕рдордЬреВрди рди рдШреЗрддрд╛ рддреНрд░реБрдЯреА рд╕рдВрджреЗрд╢ рдкрд╛рд╣рд┐рд▓реЗ рдЖрд╣реЗрдд. рдбреАрдлреЙрд▓реНрдЯрдиреБрд╕рд╛рд░ рдЖрдореНрд╣реА 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);
};
рд╣реЗ рдлрдВрдХреНрд╢рди рддреБрдордЪреНрдпрд╛ рдПрдкреАрдЖрдп рдХреЙрд▓рдордзреНрдпреЗ рдЗрдВрдкреЛрд░реНрдЯ рдХрд░рд╛.
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));
}
});
};
рдЪрд▓рд╛ рдкрджреНрдзрддреА рддрдкрд╛рд╕реВрдпрд╛:
- рд╕реЗрдЯ рд▓реЗрд╡реНрд╣рд▓ рддреБрдореНрд╣рд╛рд▓рд╛ рд╕реЗрдиреНрдЯреНрд░реА рдбреЕрд╢рдмреЛрд░реНрдбрдордзреНрдпреЗ рд▓реЗрд╡реНрд╣рд▓ рдПрд░рд░ рдШрд╛рд▓рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ. рдпрд╛рдд рдЧреБрдгрдзрд░реНрдо рдЖрд╣реЗрдд - 'рдШрд╛рддрдХ', 'рддреНрд░реБрдЯреА', 'рдЪреЗрддрд╛рд╡рдгреА', 'рд▓реЙрдЧ', 'рдорд╛рд╣рд┐рддреА, 'рдбреАрдмрдЧ', 'рдЧрдВрднреАрд░').
- рд╕реЗрдЯ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдХреЛрдгрддрд╛рд╣реА рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдбреЗрдЯрд╛ (рдЖрдпрдбреА, рдИрдореЗрд▓ рдкрддреНрддрд╛, рдкреЗрдореЗрдВрдЯ рдпреЛрдЬрдирд╛ рдЗ.) рдЬрддрди рдХрд░рдгреНрдпрд╛рдд рдорджрдд рдХрд░рддреЗ.
- рд╕реЗрдЯ рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓рд╛ рдХреЛрдгрддрд╛рд╣реА рдбреЗрдЯрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд╕рдВрдЪрдпрд┐рдд рдХрд░рд╛.
рдЬрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рдмрдЧрдмрджреНрджрд▓ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪрд╛ рдлреАрдбрдмреЕрдХ рдорд┐рд│рд╡рд╛рдпрдЪрд╛ рдЕрд╕реЗрд▓ рддрд░ рддреБрдореНрд╣реА showReportDialog рдлрдВрдХреНрд╢рди рд╡рд╛рдкрд░рд╛рд╡реЗ.
Sentry.showReportDialog();
рдирд┐рд╖реНрдХрд░реНрд╖:
рдЖрдЬ рдЖрдореНрд╣реА рд╕реЗрдиреНрдЯреНрд░реАрд▓рд╛ рд░рд┐рдНрдХреНрдЯ рдНрдкреНрд▓рд┐рдХреЗрд╢рдирдордзреНрдпреЗ рд╕рдорд╛рдХрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рдЪрд╛ рдПрдХ рдорд╛рд░реНрдЧ рд╡рд░реНрдгрди рдХреЗрд▓рд╛ рдЖрд╣реЗ.
тЖТ рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдо рджреНрд╡рд╛рд░реЗ рдЪреЕрдЯ
рд╕реНрддреНрд░реЛрдд: www.habr.com