Express PlatoBlockchain Data Intelligence'i erandite käsitlemise juhend. Vertikaalne otsing. Ai.

Ekspressi erandite käsitlemise juhend

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, responseja 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 dotenvja 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:

Express PlatoBlockchain Data Intelligence'i erandite käsitlemise juhend. Vertikaalne otsing. Ai.

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.

Täiendavad ressursid

Ajatempel:

Veel alates Stackabus