
Idag kommer jag att berÀtta om realtidsfelspÄrning i en React-applikation. GrÀnssnittsapplikationen anvÀnds vanligtvis inte för felspÄrning. MÄnga företag skjuter ofta upp felspÄrning och Äterkommer till det efter dokumentation, tester och sÄ vidare. Men om du kan förbÀttra din produkt, gör bara det!
1. Varför behöver du Sentry?
Jag antar att du Àr intresserad av att spÄra fel i produktionsprocessen.
Tycker du att det Àr otillrÀckligt?
Bra, lÄt oss titta pÄ detaljerna.
HuvudskÀlen till att anvÀnda Sentry för utvecklare:
- Minskar riskerna vid distribution av kod med fel.
- HjÀlper QA att testa koden.
- FÄr snabba aviseringar om problem.
- Möjlighet att snabbt ÄtgÀrda fel.
- FÄr en anvÀndarvÀnlig visualisering av fel i administrationspanelen.
- Sortera fel efter anvÀndarsegment / webblÀsare.
HuvudskÀlen för CEO / projektledare.
- Spara pengar (Sentry kan installeras pÄ era servrar).
- FÄ anvÀndarfeedback.
- FörstÄ vad som gÄr fel med ditt projekt i realtid.
- FörstÄ hur mÄnga problem anvÀndare har med din applikation.
- HjÀlper till att identifiera omrÄden dÀr dina utvecklare har gjort misstag.
Jag tror att utvecklare skulle vara sÀrskilt intresserade av den hÀr artikeln. Du kan ocksÄ anvÀnda denna lista med skÀl för att övertyga ledningen att integrera Sentry.
Var försiktig med den sista punkten pÄ listan för företaget.
Ăr du redan intresserad?

Vad Àr Sentry?
Sentry Àr en felspÄrningsapplikation med öppen kÀllkod som hjÀlper utvecklare att spÄra och ÄtgÀrda krascher i realtid. TÀnk ocksÄ pÄ att applikationen kan öka effektiviteten och förbÀttra anvÀndarupplevelsen. Sentry stöder JavaScript, Node, Python, PHP, Ruby, Java och andra programmeringssprÄk.

2. Logga in och skapa ett projekt.
- Ăppna ditt Sentry-konto. Du kanske mĂ„ste logga in. (Observera att Sentry kan installeras pĂ„ era servrar.)
- Det nÀsta steget Àr att skapa ett projekt.
- VÀlj ditt sprÄk frÄn listan. (Vi kommer att vÀlja React. Klicka pÄ 'Skapa projekt.')

StÀll in din applikation. Ett grundlÀggande exempel pÄ hur man integrerar Sentry i en behÄllare kan ses nedan:
import * as Sentry from '@sentry/browser';
// Sentry.init({
// dsn: "<https:>"
// });
// skulle ha anropats innan det används här
// helst innan din React-app ens renderas
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()}>Rapportera feedback</a>
);
} else {
//när det inte finns något fel, rendera barnen oförändrade
return this.props.children;
}
}
}I Sentry finns det en anvÀndbar guide som hjÀlper dig att förstÄ vad du bör göra hÀrnÀst. Du kan följa dessa steg. Jag vill visa dig hur du skapar din första felhanterare. UtmÀrkt, vi har skapat ett projekt! LÄt oss gÄ vidare till nÀsta steg.
3. Integration av React och Sentry
Du mÄste installera npm-paketet i ditt projekt.
npm i @sentry/browserInitiera Sentry i din behÄllare:
Sentry.init({
// dsn: #dsnUrl,
});DSN finns under Projekt -> InstÀllningar -> Klientnycklar. Du kan hitta klientnycklarna i sökfÀltet.

componentDidCatch(error, errorInfo) {
Sentry.withScope(scope => {
Object.keys(errorInfo).forEach(key => {
scope.setExtra(key, errorInfo[key]);
});
Sentry.captureException(error);
});
}4. SpÄra det första felet
Jag anvÀnde till exempel en enkel musikapplikation med Deezer API. Du kan se det. . Vi behöver skapa ett fel. Ett sÀtt att göra detta Àr att Ätkomma egenskapen "undefined".
Vi mÄste skapa en knapp som anropar. console.log med user.email. Efter detta ÄtgÀrd bör vi fÄ ett felmeddelande: Uncaught TypeError (kan inte lÀsa egenskap frÄn undefined e-post) pÄ grund av att anvÀndarobjektet saknas. Du kan ocksÄ anvÀnda Javascript-undantag.
Hela behÄllaren ser ut sÄ hÀr:
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:\/\/fc0edcf6927a4397855797a033f04085@sentry.io\/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()}>Rapportera feedback1</div>
<h1>Musik Sökare</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);Efter att ha integrerat denna knapp bör du testa den i webblÀsaren.

Vi har vÄrt första fel.

Whoo-hoo!

Om du klickar pÄ felrubriken kommer du att se stacktraceringen.

Meddelandena ser dÄliga ut. SjÀlvklart har vi sett felmeddelanden utan att förstÄ var denna kod Àr. Som standard handlar det om kÀllkartan i ReactJS, eftersom de inte Àr konfigurerade.
Jag skulle ocksÄ vilja ge instruktioner om hur man konfigurerar kÀllkartan, men det skulle göra denna artikel mycket lÀngre Àn jag hade planerat.
Du kan utforska detta Àmne. . Om du Àr intresserad av denna artikel, kommer att publicera del tvÄ om integration av kÀllkartan. SÄ tryck gÀrna pÄ fler gilla-markeringar och prenumerera pÄ , sÄ att du inte missar del tvÄ.
5. AnvÀndning Sentry med slutpunkt API
Okej. Vi har gÄtt igenom Javascript-undantaget i de tidigare punkterna. Men vad ska vi göra med XHR-fel?
Sentry har ocksÄ anpassad felhantering. Jag har anvÀnt den för att spÄra API-fel.
Sentry.captureException(err)Du kan konfigurera felnamn, nivÄ, lÀgga till data, unika anvÀndardata med din app, e-post etc.
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": "john.doe@example.com"})
.setLevel("Error")
);
return Sentry.captureException(err);
}
if (response) {
return dispatch(setList(response.body.data));
}
});Jag skulle vilja anvÀnda en gemensam funktion för API catch.
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(); - Om du vill fÄ Äterkoppling frÄn anvÀndare om fel
return Sentry.captureException(error);
};Importera denna funktion i api-anropet.
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));
}
});
};LÄt oss kolla metoderna:
- setLevel lĂ„ter dig infoga en fel nivĂ„ i Sentrys instrumentbrĂ€da. Den har egenskaper â 'fatal', 'error', 'warning', 'log', 'info', 'debug', 'critical'.
- setUser hjÀlper till att spara alla anvÀndardata (id, e-postadress, betalningsplan etc.).
- setExtra lÄter dig ange vilken data du behöver, till exempel butiken.
Om du vill fÄ anvÀndarfeedback om ett fel bör du anvÀnda funktionen showReportDialog.
Sentry.showReportDialog();Slutsats:
Idag har vi beskrivit ett av sÀtten att integrera Sentry i en React-app.
â Telegram-grupp om
KĂ€lla: habr.com
