Sissejuhatus
Kui kasutajad mis tahes rakendustega suhtlevad, ilmnevad erandid ja vead. Tarkvarainsenerid peavad valima vahendi, kuidas teadlikult või teadmata tekkida võivaid tõrkeid lahendada. Selle tulemusel leiavad Expressiga API-sid loovad taustaarendajad, kes töötavad selle nimel, et nad looksid kasuliku, tõhusa ja kasutatava API. Kõige olulisem on vigade käsitlemine nii, et luuakse tugev süsteem, kuna see aitab vähendada arendusaega, otseseid vigu, tootlikkuse probleeme ning määrab tarkvaraarenduse edukuse või mastaapsuse.
Kas peate veateate logima, tõrke maha suruma, kasutajaid veast teavitama või vigade käsitlemiseks koodi kirjutama? Ei imesta enam.
Selles juhendis õpime, kuidas luua Express-rakenduste jaoks jõulist veakäsitluse koodibaasi, mis aitab tuvastada rakenduse vigu ja võtta optimaalseid toiminguid, et taastada mis tahes rakendus käitusaja jooksul graatsiliselt rikke tõttu.
Märge: Kasutame oma demos API testimiseks Postmani. Saate selle alla laadida saidilt Postimees Allalaadimisleht. Teise võimalusena võite kasutada lihtsalt brauserit, käsurida curl
tööriist või mõni muu teile tuttav tööriist.
Mis on vigade käsitlemine?
Tarkvaraarenduses on kahte tüüpi erandeid: töökorras ja programmiline.
- Käitusajal võivad tekkida talitlushäired ja selleks, et vältida rakenduse äkilist lõpetamist, peame nende eranditega toime tulema tõhusate veakäsitlusmeetodite abil.
- Programmeerija teeb programmilised erandid käsitsi, kui ilmneb erandlik seisund.
Tegevuserandeid võib pidada "ootamatuteks, kuid ettenähtavateks" eranditeks (nt juurdepääs indeksile väljaspool piire) ja programmilisi erandeid kui "oodatud ja ette nähtud" erandeid (nt numbrivormingu erand).
Erandi käsitlemine on protseduur, mida kasutatakse programmis vigade leidmiseks ja parandamiseks. Tõrkehaldus saadab teateid, mis sisaldavad juhtunud tõrke tüüpi ja virna, kus viga ilmnes.
Märge: Arvutiteaduses on erandid taastatavad ja tulenevad tavaliselt käitus- või programmiprobleemidest. Vead tekivad tavaliselt välistest teguritest, nagu riistvarapiirangud, ühenduvusprobleemid, mälupuudus jne. JavaScriptis kasutatakse termineid sageli vaheldumisi ja kohandatud erandid tuletatakse Error
klass. The Error
klass ise esindab nii vigu kui ka erandeid.
Ekspressis viitab erandite käsitlemine sellele, kuidas Express seab end sünkroonsete ja asünkroonsete erandite püüdmiseks ja töötlemiseks. Expressi erandite käsitlemise hea asi on see, et arendajana ei pea te ise kirjutama erandikäsitlejaid. Expressiga on kaasas vaikeerandite töötleja. Erandite töötleja aitab tuvastada vigu ja teavitada neist kasutajat. Samuti pakub see erinevaid parandusstrateegiaid ja rakendab neid erandite leevendamiseks.
Kuigi see võib tunduda, et kapoti alla jääb palju asju, ei aeglusta erandite käsitlemine Expressis programmi üldist protsessi ega peata selle täitmist.
Ekspressi erandite käsitlemise mõistmine
Expressiga kaasas oleva vaikeveakäsitlejaga on meie kätes hulk vahevara funktsioone, mis aitavad marsruudikäsitlejates vigu automaatselt tabada. Peagi loome projekti teooria elluviimiseks selle kohta, kuidas Expressi rakenduses õigeid vigu tagastada ja kuidas tundlikku teavet mitte lekitada.
Vahevara funktsiooni määratlemine Expressis
Veatöötluse vahevara funktsioonid on määratletud nii, et need aktsepteerivad an Error
objekt esimese sisendparameetrina, millele järgnevad mis tahes muu vahevara funktsiooni vaikeparameetrid: request
, response
ja next
. next()
funktsioon jätab kogu praeguse vahevara vahele ruuteri järgmise veakäsitleja juurde.
Ekspressi veakäsitluse seadistamine
Rakenduse Node and Express loomiseks käivitage terminalis järgmine käsk:
$ mkdir error-handling-express
Initsialiseerime vastloodud kaustas uue Node projekti:
$ cd error-handling-express && npm init -y
See loob a package.json
fail meie kaustas.
Express-serveri loomiseks meie Node-rakenduses peame installima express
paketi dotenv
keskkonnamuutujate automaatseks laadimiseks .env
faili sisse process.env
objekt ja nodemon
sõlmerakenduse taaskäivitamiseks, kui kataloogis on märgitud failimuudatus.
$ npm install express dotenv nodemon
Järgmisena looge an app.js
faili projekti kaustas, mis toimib rakenduse registrifailina.
Nüüd, kui oleme oma Expressi rakenduse jaoks installinud kõik vajalikud sõltuvused, peame seadistama skripti rakenduse lugemiseks package.json
faili. Selle saavutamiseks on package.json
faili, nii et scripts
objekt on selline, nagu allpool näidatud:
"scripts": {
"start": "nodemon app.js"
},
Teise võimalusena võite kasutamise vahele jätta nodemon
, ja kasutage node app.js
asemel.
Expressi serveri seadistamine
Serveri seadistamiseks peame esmalt importima erinevad paketid app.js
. Samuti loome a .env
faili projekti kataloogis – et salvestada kõik rakenduse keskkonnamuutujad:
const express = require('express')
require('dotenv').config
PORT=4000
Oleme määratlenud rakenduse pordi numbri .env
, mille laadib ja loeb dotenv
ja sellele pääseb juurde hiljem.
Express Serveri lähtestamine
Nüüd peame käivitama Expressi serveri ja panema meie rakenduse kuulama rakenduse pordi numbrit koos testmarsruudi taotlusega – /test
. Värskendame app.js
, impordi avalduste all:
const app = express();
const port = process.env.PORT || 4000;
app.get("/test", async (req, res) => {
return res.status(200).json({ success: true });
});
app.listen(port, () => {
console.log(`Server is running at port ${port}`);
});
Siit edasi õpime, kuidas käsitleda erinevaid Expressis esinevate töövigade kasutusjuhtumeid.
Ei leitud vigade käsitlemine Expressis
Oletame, et peate tõmbama kõik kasutajad kasutajate andmebaasist, saate tõhusalt toime tulla võimaliku veastsenaariumiga, kui andmebaasis pole andmeid, mähkides loogika try/catch
plokk – lootes tabada mis tahes tõrkeid, mis võiksid projekteerida catch
plokk:
const getUser = () => undefined;
app.get("/get-user", async (req, res) => {
try {
const user = getUser();
if (!user) {
throw new Error('User not found');
}
} catch (error) {
console.log(error);
res.status(400).send(error.message)
}
return res.status(200).json({
success: true
});
});
Selle tulemuseks on:
User not found
Nüüd, kui see päring on tehtud (saate testida Postmani abil) ja andmebaasis pole ühtegi kasutajat, saab klient tõrketeate "Kasutajat ei leitud". Samuti märkate, et tõrge on ka konsoolis sisse logitud.
Veakäsitluse optimeerimine veakäsitleja vahevara abil
Arendust saame optimeerida, luues veakäsitleja vahevara, mis tuleb kõigi määratletud marsruutide lõpus, nii et kui mõnel marsruudil tekib tõrge, vaatab Express automaatselt järgmist vahevara ja jätkab loendis allapoole liikumist. kuni see jõuab veakäsitlejani. Veakäsitleja töötleb viga ja saadab ka vastuse kliendile tagasi.
Tutvuge meie praktilise ja praktilise Giti õppimise juhendiga, mis sisaldab parimaid tavasid, tööstusharus aktsepteeritud standardeid ja kaasas olevat petulehte. Lõpetage Giti käskude guugeldamine ja tegelikult õppima seda!
Alustamiseks looge kaust nimega middleware
projekti kataloogis ja selles kaustas looge fail nimega errorHandler.js
mis määratleb veakäsitleja:
const errorHandler = (error, req, res, next) => {
console.log(error);
res.status(400).send(error.message);
}
module.exports = errorHandler;
Oleme oma vahevara funktsioonis andnud Expressile teada, et see ei ole vahevara põhifunktsioon, vaid veakäsitleja, lisades error
parameeter enne 3 põhiparameetrit.
Nüüd kasutame oma demos veakäsitlejat app.js
ja käsitlege algset viga kasutajate toomisel veakäsitleja vahevaraga, nagu allpool näidatud:
const getUser = () => undefined;
app.get("/get-user", async (req, res, next) => {
try {
const user = getUser();
if (!user) {
throw new Error("User not found");
}
} catch (error) {
return next(error);
}
});
app.use(errorHandler);
Saame oma koodi veelgi optimeerida, luues selle ümber abstraktsiooni try/catch
loogika. Seda saame saavutada, luues projekti kataloogis uue kausta nimega utils
, ja looge selles fail nimega tryCatch.js
.
Abstraheerida try-catch
loogika – saame määratleda funktsiooni, mis aktsepteerib teist funktsiooni (tuntud kui kontroller) parameetrina ja tagastab an async
funktsioon, mis hoiab a try/catch
mis tahes vastuvõetud kontrolleri jaoks.
Kui kontrolleris ilmneb tõrge, jääb see seadmesse catch
plokk ja järgmist funktsiooni nimetatakse:
const tryCatch = (controller) => async (req, res, next) => {
try {
await controller(req, res);
} catch (error) {
return next(error);
}
};
module.exports = tryCatch;
Koos try/catch
abstraktsiooni, saame oma koodi ümber kujundada, et muuta see napisõnalisemaks, jättes vahele try-catch
klausel kasutajate toomisel rakenduses app.js
:
const getUser = () => undefined;
app.get(
"/get-user",
tryCatch(async (req, res) => {
const user = getUser();
if (!user) {
throw new Error("User not found");
}
res.status(400).send(error.message);
})
);
Oleme proovi püüdmise loogika edukalt abstraheerinud ja meie kood töötab endiselt nagu varem.
Valideerimisvigade käsitlemine Expressis
Selle demo jaoks loome oma Expressi rakenduses sisselogimiseks uue marsruudi – kasutaja ID kinnitamiseks sisselogimisel. Esmalt installime joi
pakett, mis aitab luua skeemi, mille abil saame nõudeid jõustada:
$ npm i joi
Järgmisena looge skeem, mis on a Joi.object
koos userId
mis peab olema number ja on nõutav – see tähendab, et päring peab vastama objektile, millel on kasutajatunnus.
Me saame kasutada validate()
meetod skeemiobjektis iga sisendi kinnitamiseks skeemi suhtes:
const schema = Joi.object({
userId: Joi.number().required(),
});
app.post(
"/login",
tryCatch(async (req, res) => {
const {error, value} = schema.validate({});
if (error) throw error;
})
);
Kui tühi objekt sisestatakse validate()
meetodil, käsitletakse viga graatsiliselt ja veateade saadetakse kliendile:
Konsoolil saame ligipääsu ka a details
massiiv, mis sisaldab erinevaid üksikasju vea kohta, mida saaks vajadusel kasutajale edastada.
Valideerimisvigade konkreetseks käsitlemiseks nii, et iga valideerimisvea kohta edastataks asjakohane veateave, saab veakäsitleja vahevara ümber kujundada.
const errorHandler = (error, req, res, next) => {
console.log(error);
if (error.name === "ValidationError") {
return res.status(400).send({
type: "ValidationError",
details: error.details,
});
}
res.status(400).send(error.message);
};
module.exports = errorHandler;
koos errorHandler.js
nüüd kohandatud, kui esitame sama päringu tühja objektiga, mis on edastatud kasutajale validate()
meetod:
Nüüd on meil juurdepääs kohandatud objektile, mis tagastab sõnumeid loetavamal/sõbralikumal viisil. Nii saame saata ja käsitleda erinevat tüüpi tõrkeid vastavalt sissetuleva vea tüübile.
Järeldus
Selles juhendis käsitlesime kõiki Express.js-i veakäsitluse aspekte, sealhulgas seda, kuidas sünkroonset ja asünkroonset koodi vaikimisi käsitletakse, kuidas luua oma veaklasse, kuidas kirjutada kohandatud veakäsitluse vahevara funktsioone ja pakkuda next
viimase saagi käitlejana
Nagu iga ülesande puhul, on arenduse käigus ka parimaid tavasid, mis hõlmavad tõhusat vigade käsitlemist, ja täna oleme õppinud, kuidas saame Expressi rakenduses vigu tõhusalt käsitleda.
Vigade õige käsitlemine ei tähenda mitte ainult arendusaja lühendamist, leides vigu ja vigu hõlpsalt, vaid ka suuremahuliste rakenduste jaoks tugeva koodibaasi väljatöötamist. Selles juhendis oleme näinud, kuidas seadistada vahevara töövigade käsitlemiseks. Mõned muud veakäsitluse parandamise viisid hõlmavad järgmist: virnajälgede saatmata jätmine, protsesside graatsiline peatamine tabamata erandite käsitlemiseks, asjakohaste veateadete edastamine, vealogide saatmine ja klassi seadistamine, mis laiendab Error
klass.
Loodan, et selles õpetuses kasutatud näited olid teile meeldivad. Käsitlesin erinevaid stsenaariume, millega võite kokku puutuda, kui kirjutate Expressi rakendust, mida kasutatakse reaalses maailmas veahalduse kohta. Palun andke mulle teada, kui jäin millestki ilma. See on meile kasulik ja aitab mul ka rohkem õppida. Head päeva ja tänan lugemise eest.
Võite viidata kogu artiklis kasutatud lähtekoodile Github.