เจ เฉฑเจ เจฎเฉเจ เจคเฉเจนเจพเจจเฉเฉฐ เจฐเฉเจเจเจ เจเจชเจฒเฉเจเฉเจธเจผเจจ เจตเจฟเฉฑเจ เจฐเฉเจ เจฒ-เจเจพเจเจฎ เจเจฐเจฐ เจเฉเจฐเฉเจเจฟเฉฐเจ เจฌเจพเจฐเฉ เจฆเฉฑเจธเจพเจเจเจพเฅค เจเฉฑเจ เจซเจฐเฉฐเจ-เจเจเจก เจเจชเจฒเฉเจเฉเจธเจผเจจ เจเจฎ เจคเฉเจฐ 'เจคเฉ เจเจฒเจคเฉ เจเจฐเฉเจเจฟเฉฐเจ เจฒเจ เจจเจนเฉเจ เจตเจฐเจคเฉ เจเจพเจเจฆเฉ เจนเฉเฅค เจเฉเจ เจเฉฐเจชเจจเฉเจเจ เจ เจเจธเจฐ เจฌเฉฑเจ เจเจฐเฉเจเจฟเฉฐเจ เจจเฉเฉฐ เจฌเฉฐเจฆ เจเจฐ เจฆเจฟเฉฐเจฆเฉเจเจ เจนเจจ, เจฆเจธเจคเจพเจตเฉเจเจผเจพเจ, เจเฉเจธเจเจพเจ, เจเจฆเจฟ เจคเฉเจ เจฌเจพเจ เจฆ เจเจธ 'เจคเฉ เจตเจพเจชเจธ เจเจเจเจฆเฉเจเจ เจนเจจเฅค เจนเจพเจฒเจพเจเจเจฟ, เจเฉ เจคเฉเจธเฉเจ เจเจชเจฃเฉ เจเจคเจชเจพเจฆ เจจเฉเฉฐ เจฌเจฟเจนเจคเจฐ เจฒเจ เจฌเจฆเจฒ เจธเจเจฆเฉ เจนเฉ, เจคเจพเจ เจฌเฉฑเจธ เจเจน เจเจฐเฉ!
1. เจคเฉเจนเจพเจจเฉเฉฐ เจธเฉฐเจคเจฐเฉ เจฆเฉ เจฒเฉเฉ เจเจฟเจเจ เจนเฉ?
เจฎเฉเจ เจฎเฉฐเจจเจฆเจพ เจนเจพเจ เจเจฟ เจคเฉเจธเฉเจ เจเจคเจชเจพเจฆเจจ เจฆเฉ เจฆเฉเจฐเจพเจจ เจฌเฉฑเจเจพเจ เจจเฉเฉฐ เจเจฐเฉเจ เจเจฐเจจ เจตเจฟเฉฑเจ เจฆเจฟเจฒเจเจธเจชเฉ เจฐเฉฑเจเจฆเฉ เจนเฉ
เจเฉ เจคเฉเจนเจพเจจเฉเฉฐ เจฒเจเจฆเจพ เจนเฉ เจเจฟ เจเจน เจเจพเจซเจผเฉ เจจเจนเฉเจ เจนเฉ?
เจ เฉเจ เจนเฉ, เจเจ เจตเฉเจฐเจตเฉ เจจเฉเฉฐ เจตเฉเจเฉเจ.
เจกเจฟเจตเฉเจฒเจชเจฐเจพเจ เจฒเจ เจธเฉฐเจคเจฐเฉ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจ เจฆเฉ เจชเฉเจฐเจฎเฉเฉฑเจ เจเจพเจฐเจจ:
- เจเจฒเจคเฉเจเจ เจตเจพเจฒเฉ เจเฉเจก เจจเฉเฉฐ เจคเฉเจจเจพเจค เจเจฐเจจ เจตเฉเจฒเฉ เจคเฉเจนเจพเจจเฉเฉฐ เจเฉเจเจฎเจพเจ เจคเฉเจ เจฌเจเจฃ เจฆเฉ เจเจเจฟเจ เจฆเจฟเฉฐเจฆเจพ เจนเฉ
- เจเฉเจก เจเฉเจธเจเจฟเฉฐเจ เจตเจฟเฉฑเจ QA เจฆเฉ เจฎเจฆเจฆ เจเจฐเฉ
- เจธเจฎเฉฑเจธเจฟเจเจตเจพเจ เจฌเจพเจฐเฉ เจคเฉเจฐเฉฐเจค เจธเฉเจเจจเจพเจตเจพเจ เจชเฉเจฐเจพเจชเจค เจเจฐเฉ
- เจเจฒเจคเฉเจเจ เจจเฉเฉฐ เจเจฒเจฆเฉ เจ เฉเจ เจเจฐเจจ เจฆเฉ เจธเจฎเจฐเฉฑเจฅเจพ
- เจเจกเจฎเจฟเจจ เจชเฉเจจเจฒ เจตเจฟเฉฑเจ เจคเจฐเฉเฉฑเจเฉเจเจ เจฆเจพ เจเฉฑเจ เจธเฉเจตเจฟเจงเจพเจเจจเจ เจชเฉเจฐเจฆเจฐเจธเจผเจจ เจชเฉเจฐเจพเจชเจค เจเจฐเจจเจพ
- เจเจชเจญเฉเจเจคเจพ/เจฌเฉเจฐเจพเจเจเจผเจฐ เจนเจฟเฉฑเจธเฉ เจฆเฉเจเจฐเจพ เจคเจฐเฉเฉฑเจเฉเจเจ เจจเฉเฉฐ เจเจพเจเจเฉ
เจธเฉเจเจ/เจฒเฉเจก เจชเฉเจฐเฉเจเฉเจเจ เจฆเฉ เจฎเฉเฉฑเจ เจเจพเจฐเจจ
- เจชเฉเจธเฉ เจฌเจเจพเจ (เจธเฉเจเจเจฐเฉ เจคเฉเจนเจพเจกเฉ เจธเจฐเจตเจฐเจพเจ 'เจคเฉ เจธเจฅเจพเจชเจค เจเฉเจคเฉ เจเจพ เจธเจเจฆเฉ เจนเฉ)
- เจเจชเจญเฉเจเจคเจพ เจซเฉเจกเจฌเฉเจ เจชเฉเจฐเจพเจชเจค เจเจฐเจจเจพ
- เจ เจธเจฒ เจธเจฎเฉเจ เจตเจฟเฉฑเจ เจคเฉเจนเจพเจกเฉ เจชเฉเจฐเฉเจเฉเจเจ เจตเจฟเฉฑเจ เจเฉ เจเจฒเจค เจนเฉ เจจเฉเฉฐ เจธเจฎเจเจฃเจพ
- เจคเฉเจนเจพเจกเฉ เจเจช เจจเจพเจฒ เจฒเฉเจเจพเจ เจฆเฉเจเจ เจธเจฎเฉฑเจธเจฟเจเจตเจพเจ เจฆเฉ เจธเฉฐเจเจฟเจ เจจเฉเฉฐ เจธเจฎเจเจฃเจพ
- เจเจนเจจเจพเจ เจฅเจพเจตเจพเจ เจจเฉเฉฐ เจฒเฉฑเจญเจฃ เจตเจฟเฉฑเจ เจคเฉเจนเจพเจกเฉ เจฎเจฆเจฆ เจเจฐเฉ เจเจฟเฉฑเจฅเฉ เจคเฉเจนเจพเจกเฉ เจตเจฟเจเจพเจธเจเจพเจฐเจพเจ เจจเฉ เจเจฒเจคเฉเจเจ เจเฉเจคเฉเจเจ เจนเจจ
เจฎเฉเจจเฉเฉฐ เจฒเจเจฆเจพ เจนเฉ เจเจฟ เจกเจฟเจตเฉเจฒเจชเจฐ เจชเจนเจฟเจฒเจพเจ เจเจธ เจฒเฉเจ เจตเจฟเฉฑเจ เจฆเจฟเจฒเจเจธเจชเฉ เจฒเฉเจฃเจเฉ. เจคเฉเจธเฉเจ เจเจชเจฃเฉ เจฎเจพเจฒเจเจพเจ เจจเฉเฉฐ เจธเฉฐเจคเจฐเฉ เจจเฉเฉฐ เจเจเฉเจเฉเจฐเจฟเจค เจเจฐเจจ เจฒเจ เจฎเจจเจพเจเจฃ เจฒเจ เจเจพเจฐเจจเจพเจ เจฆเฉ เจเจธ เจธเฉเจเฉ เจฆเฉ เจตเจฐเจคเฉเจ เจตเฉ เจเจฐ เจธเจเจฆเฉ เจนเฉเฅค
เจเจพเจฐเฉเจฌเจพเจฐเฉ เจธเฉเจเฉ 'เจคเฉ เจเจเจฐเฉ เจเจเจเจฎ เจจเจพเจฒ เจธเจพเจตเจงเจพเจจ เจฐเจนเฉเฅค
เจเฉ เจคเฉเจธเฉเจ เจชเจนเจฟเจฒเจพเจ เจนเฉ เจฆเจฟเจฒเจเจธเจชเฉ เจฐเฉฑเจเจฆเฉ เจนเฉ?
เจธเฉฐเจคเจฐเฉ เจเฉ เจนเฉ?
Sentry เจเฉฑเจ เจเจชเจจ เจธเฉเจฐเจธ เจฌเฉฑเจ เจเจฐเฉเจเจฟเฉฐเจ เจเจชเจฒเฉเจเฉเจธเจผเจจ เจนเฉ เจเฉ เจกเจฟเจตเฉเจฒเจชเจฐเจพเจ เจจเฉเฉฐ เจฐเฉเจ เจฒ เจเจพเจเจฎ เจตเจฟเฉฑเจ เจเฉเจฐเฉเจธเจผเจพเจ เจจเฉเฉฐ เจเจฐเฉเจ เจเจฐเจจ เจ เจคเฉ เจ เฉเจ เจเจฐเจจ เจตเจฟเฉฑเจ เจฎเจฆเจฆ เจเจฐเจฆเฉ เจนเฉเฅค เจเจน เจจเจพ เจญเฉเฉฑเจฒเฉ เจเจฟ เจเจชเจฒเฉเจเฉเจธเจผเจจ เจคเฉเจนเจพเจจเฉเฉฐ เจเฉเจธเจผเจฒเจคเจพ เจตเจงเจพเจเจฃ เจ เจคเฉ เจเจชเจญเฉเจเจคเจพ เจ เจจเฉเจญเจต เจจเฉเฉฐ เจฌเจฟเจนเจคเจฐ เจฌเจฃเจพเจเจฃ เจฆเฉ เจเจเจฟเจ เจฆเจฟเฉฐเจฆเฉ เจนเฉเฅค Sentry 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. เจเจธ เจเจพเจฐเจตเจพเจ เจคเฉเจ เจฌเจพเจ
เจฆ เจธเจพเจจเฉเฉฐ เจเฉฑเจ เจเจฒเจคเฉ เจธเฉเจจเฉเจนเจพ เจชเฉเจฐเจพเจชเจค เจเจฐเจจเจพ เจเจพเจนเฉเจฆเจพ เจนเฉ: 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);
เจเจธ เจฌเจเจจ เจจเฉเฉฐ เจเจเฉเจเฉเจฐเจฟเจค เจเจฐเจจ เจคเฉเจ เจฌเจพเจ เจฆ, เจคเฉเจนเจพเจจเฉเฉฐ เจฌเฉเจฐเจพเจเจเจผเจฐ เจตเจฟเฉฑเจ เจเจธเจฆเฉ เจเจพเจเจ เจเจฐเจจเฉ เจเจพเจนเฉเจฆเฉ เจนเฉเฅค
เจธเจพเจกเฉ เจชเจนเจฟเจฒเฉ เจเจฒเจคเฉ เจนเฉ
เจนเฉ-เจนเฉ!
เจเฉเจเจฐ เจคเฉเจธเฉเจ เจธเจฟเจฐเจฒเฉเจ เจฆเฉ เจเจฒเจคเฉ 'เจคเฉ เจเจฒเจฟเฉฑเจ เจเจฐเจฆเฉ เจนเฉ, เจคเจพเจ เจคเฉเจธเฉเจ เจเฉฑเจ เจธเจเฉเจ เจเจฐเฉเจธ เจตเฉเจเฉเจเฉเฅค
เจธเฉเจจเฉเจนเฉ เจฌเฉเจฐเฉ เจฒเฉฑเจเจฆเฉ เจนเจจเฅค เจฌเฉเจธเจผเฉฑเจ เจ เจธเฉเจ เจเฉเจก เจเจฟเฉฑเจฅเฉ เจนเฉ เจเจน เจธเจฎเจเฉ เจฌเจฟเจจเจพเจ เจเจฒเจคเฉ เจธเฉเจจเฉเจนเฉ เจฆเฉเจเฉ เจนเจจเฅค เจฎเฉเจฒ เจฐเฉเจช เจตเจฟเฉฑเจ เจ เจธเฉเจ 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));
}
});
};
เจเจ เจคเจฐเฉเจเจฟเจเจ เจฆเฉ เจเจพเจเจ เจเจฐเฉเจ:
- เจธเฉเฉฑเจ เจฒเฉเจตเจฒ เจคเฉเจนเจพเจจเฉเฉฐ เจธเฉเจเจเจฐเฉ เจกเฉเจธเจผเจฌเฉเจฐเจก เจตเจฟเฉฑเจ เจเฉฑเจ เจชเฉฑเจงเจฐ เจฆเฉ เจเจฒเจคเฉ เจชเจพเจเจฃ เจฆเฉ เจเจเจฟเจ เจฆเจฟเฉฐเจฆเจพ เจนเฉเฅค เจเจธ เจฆเฉเจเจ เจตเจฟเจธเจผเฉเจธเจผเจคเจพเจตเจพเจ เจนเจจ - 'เจเจพเจคเจ', 'เจเจฒเจคเฉ', 'เจเฉเจคเจพเจตเจจเฉ', 'เจฒเจพเจ', 'เจเจพเจฃเจเจพเจฐเฉ, 'เจกเฉเจฌเฉฑเจ', 'เจจเจพเจเจผเฉเจ')เฅค
- setUser เจเจฟเจธเฉ เจตเฉ เจเจชเจญเฉเจเจคเจพ เจกเฉเจเจพ (เจเจเจกเฉ, เจเจฎเฉเจฒ เจชเจคเจพ, เจญเฉเจเจคเจพเจจ เจฏเฉเจเจจเจพ, เจเจฆเจฟ) เจจเฉเฉฐ เจธเฉเจฐเฉฑเจเจฟเจ เจค เจเจฐเจจ เจตเจฟเฉฑเจ เจฎเจฆเจฆ เจเจฐเจฆเจพ เจนเฉเฅค
- setExtra เจคเฉเจนเจพเจจเฉเฉฐ เจฒเฉเฉเฉเจเจฆเจพ เจเฉเจ เจตเฉ เจกเจพเจเจพ เจจเจฟเจฐเจงเจพเจฐเจค เจเจฐเจจ เจฆเฉ เจเจเจพเจเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉ, เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจธเจเฉเจฐเฅค
เจเฉเจเจฐ เจคเฉเจธเฉเจ เจเจฟเจธเฉ เจฌเฉฑเจ เจฌเจพเจฐเฉ เจเจชเจญเฉเจเจคเจพ เจซเฉเจกเจฌเฉเจ เจชเฉเจฐเจพเจชเจค เจเจฐเจจเจพ เจเจพเจนเฉเฉฐเจฆเฉ เจนเฉ, เจคเจพเจ เจคเฉเจนเจพเจจเฉเฉฐ showReportDialog เจซเฉฐเจเจธเจผเจจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจเฉ เจเจพเจนเฉเจฆเฉ เจนเฉเฅค
Sentry.showReportDialog();
เจธเจฟเฉฑเจเจพ:
เจ เฉฑเจ เจ เจธเฉเจ Sentry เจจเฉเฉฐ เจเฉฑเจ React เจเจชเจฒเฉเจเฉเจธเจผเจจ เจตเจฟเฉฑเจ เจเจเฉเจเฉเจฐเจฟเจค เจเจฐเจจ เจฆเจพ เจเฉฑเจ เจคเจฐเฉเจเจพ เจฆเฉฑเจธเจฟเจ เจนเฉเฅค
โ เจเฉเจฒเฉเจเฉเจฐเจพเจฎ เจเฉเจ เจฆเฉเจเจฐเจพ
เจธเจฐเฉเจค: www.habr.com