Vodnik za ravnanje z izjemami v Express PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Vodnik za obravnavo izjem v Expressu

Predstavitev

Izjeme in napake se zagotovo pojavijo, ko uporabniki komunicirajo s katero koli aplikacijo, programski inženirji pa morajo izbrati način za obravnavo kakršne koli napake, ki se lahko pojavi – zavestno ali nevede. Posledično se zaledni razvijalci, ki gradijo API-je z Expressom, znajdejo v prizadevanju, da bi zagotovili gradnjo uporabnega, učinkovitega in uporabnega API-ja. Najpomembnejše je ravnanje z napakami na tak način, da se zgradi robusten sistem, ker to pomaga skrajšati razvojni čas, neposredne napake, težave s produktivnostjo in določa uspeh ali razširljivost razvoja programske opreme.

Ali morate sporočilo o napaki zabeležiti, zatreti napako, obvestiti uporabnike o napaki ali napisati kodo za obravnavo napak? Nič več čudnega.

V tem priročniku se bomo naučili, kako zgraditi robustno kodno zbirko za obravnavo napak za aplikacije Express, ki bo pomagala pri odkrivanju napak v aplikaciji in sprejela optimalne ukrepe za obnovitev katere koli aplikacije po elegantni odpovedi med izvajanjem.

Opomba: Za testiranje API-ja v naši predstavitvi bomo uporabili Postman. Prenesete ga lahko na Stran za prenos poštarja. Druga možnost je, da preprosto uporabite brskalnik, ukazno vrstico curl orodje ali katero koli drugo orodje, ki ga morda poznate.

Kaj je obravnavanje napak?

Pri razvoju programske opreme obstajata dve različni vrsti izjem: operativno in programsko.

  • Med izvajanjem lahko pride do napak pri delovanju in da preprečimo nenadno prekinitev aplikacije, moramo te izjeme elegantno obravnavati z učinkovitimi metodami za obravnavo napak.
  • Programator ročno vrže programske izjeme, ko pride do izjemnega stanja.

Operativne izjeme si lahko predstavljate kot »nepričakovane, a predvidene« izjeme (kot je dostop do indeksa izven meja), programske izjeme pa kot »pričakovane in predvidene« izjeme (kot je izjema oblikovanja številk).

Obravnava izjem je postopek, ki se uporablja za iskanje in odpravljanje napak v programu. Obravnava napak pošlje sporočila, ki vključujejo vrsto napake, ki se je zgodila, in sklad, kjer je prišlo do napake.

Opomba: V računalništvu so izjeme popravljive in običajno izvirajo iz operativnih ali programskih težav med izvajanjem. Napake običajno nastanejo zaradi zunanjih dejavnikov, kot so omejitve strojne opreme, težave s povezljivostjo, pomanjkanje pomnilnika itd. V JavaScriptu se izraza pogosto uporabljata zamenljivo, izjeme po meri pa izhajajo iz Error razred. The Error sam razred predstavlja tako napake kot izjeme.

V Expressu se obravnavanje izjem nanaša na to, kako se Express nastavi za lovljenje in obdelavo sinhronih in asinhronih izjem. Dobra stvar pri obravnavanju izjem v Expressu je, da vam kot razvijalcu ni treba pisati lastnih obdelovalcev izjem; Express je opremljen s privzetim obdelovalcem izjem. Obravnavalec izjem pomaga pri prepoznavanju napak in poročanju o njih uporabniku. Zagotavlja tudi različne popravne strategije in jih izvaja za ublažitev izjem.

Čeprav se morda zdi, da gre veliko stvari pod pokrovom, obravnavanje izjem v Expressu ne upočasni celotnega procesa programa ali začasno ustavi njegovega izvajanja.

Razumevanje obravnave izjem v Expressu

S privzetim obdelovalcem napak, ki je priložen Expressu, imamo v rokah nabor funkcij vmesne programske opreme, ki pomagajo samodejno ujeti napake v obdelovalcih poti. Kmalu bomo ustvarili projekt za prenos teorije v prakso o tem, kako vrniti pravilne napake v aplikaciji Express in kako preprečiti uhajanje občutljivih informacij.

Definiranje funkcije vmesne programske opreme v Expressu

Funkcije vmesne programske opreme za obravnavanje napak so definirane tako, da sprejmejo Error objekt kot prvi vhodni parameter, ki mu sledijo privzeti parametri katere koli druge funkcije vmesne programske opreme: request, responsein next. next() funkcija preskoči vso trenutno vmesno programsko opremo na naslednji obravnavo napak za usmerjevalnik.

Nastavitev obravnavanja napak v Expressu

Zaženite naslednji ukaz v vašem terminalu, da ustvarite aplikacijo Node in Express:

$ mkdir error-handling-express

V novo ustvarjeni mapi inicializirajmo nov projekt Node:

$ cd error-handling-express && npm init -y

To ustvari a package.json datoteko v naši mapi.

Če želite ustvariti strežnik Express v naši aplikaciji Node, moramo namestiti express paket, dotenv za samodejno nalaganje spremenljivk okolja .env datoteko v process.env predmet, in nodemon za ponovni zagon aplikacije vozlišča, če je v imeniku zabeležena sprememba datoteke.

$ npm install express dotenv nodemon

Nato ustvarite app.js datoteko v mapi projekta, ki bo služila kot indeksna datoteka za aplikacijo.

Zdaj, ko smo namestili vse potrebne odvisnosti za našo aplikacijo Express, moramo nastaviti skript za branje aplikacije v package.json mapa. Da bi to dosegli, package.json datoteko, tako da scripts predmet je, kot je prikazano spodaj:

"scripts": {
    "start": "nodemon app.js"
},

Lahko pa tudi preskočite uporabo nodemon, in uporabo node app.js namesto tega.

Nastavitev strežnika Express

Za nastavitev strežnika moramo najprej uvoziti različne pakete v app.js. Ustvarili bomo tudi a .env datoteka v imeniku projekta – za shranjevanje vseh spremenljivk okolja za aplikacijo:



const express = require('express')
require('dotenv').config

PORT=4000 

Določili smo številko vrat za aplikacijo v .env, ki se naloži in ga prebere dotenv, do katerega lahko dostopate pozneje.

Inicializacija strežnika Express

Zdaj moramo inicializirati strežnik Express in omogočiti, da naša aplikacija posluša številko vrat aplikacije, skupaj z zahtevo za preskusno pot – /test. Posodobimo app.js, pod stavki za uvoz:


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}`);
});

Od tu naprej se bomo naučili obravnavati različne primere uporabe operativnih napak, ki se lahko pojavijo v Expressu.

Obravnava napak Ni najdeno v Expressu

Recimo, da morate pridobiti vse uporabnike iz baze podatkov uporabnikov, lahko učinkovito obravnavate potencialni scenarij napake, kjer v bazi podatkov ni podatkov, tako da ovijete logiko v try/catch blok – v upanju, da bomo ujeli kakršno koli napako, ki bi lahko projicirala v catch blok:


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
	});
});

Rezultat tega je:

User not found

Zdaj, ko je ta zahteva vložena (lahko preizkusite s programom Postman) in v zbirki podatkov ni nobenega uporabnika, odjemalec prejme sporočilo o napaki, ki pravi »Uporabnik ni bil najden«. Opazili boste tudi, da je napaka zabeležena tudi v konzoli.

Optimiziranje obravnavanja napak z vmesno programsko opremo za obravnavo napak

Razvoj lahko optimiziramo tako, da ustvarimo vmesno programsko opremo za obravnavo napak, ki bi se pojavila na koncu vseh definiranih poti, tako da bo Express, če pride do napake na eni od poti, samodejno pogledal naslednjo vmesno programsko opremo in nadaljeval po seznamu navzdol. dokler ne doseže obdelovalca napak. Obravnavalec napak bo obdelal napako in odjemalcu tudi poslal odgovor.

Oglejte si naš praktični, praktični vodnik za učenje Gita z najboljšimi praksami, standardi, sprejetimi v panogi, in priloženo goljufijo. Nehajte Googlati ukaze Git in pravzaprav naučiti it!

Za začetek ustvarite mapo z imenom middleware v imeniku projekta in v tej mapi ustvarite datoteko z imenom errorHandler.js ki definira obravnavo napak:

const errorHandler = (error, req, res, next) => {
    
    console.log(error); 
    
    res.status(400).send(error.message); 
}
module.exports = errorHandler;

V naši funkciji vmesne programske opreme smo Express opozorili, da to ni osnovna funkcija vmesne programske opreme, temveč obravnavalnik napak, tako da smo dodali error parameter pred 3 osnovnimi parametri.

Zdaj bomo v naši predstavitvi uporabili obravnavo napak app.js in obravnavanje začetne napake pri pridobivanju uporabnikov z vmesno programsko opremo za obravnavo napak, kot je prikazano spodaj:


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);

Našo kodo lahko še bolj optimiziramo, tako da ustvarimo abtsrakcijo okoli try/catch logika. To lahko dosežemo tako, da ustvarimo novo mapo v imeniku projekta, imenovano utilsin v njej ustvarite datoteko z imenom tryCatch.js.

Da povzamem try-catch logika – lahko definiramo funkcijo, ki sprejme drugo funkcijo (znano kot krmilnik) kot svoj parameter in vrne an async funkcijo, ki bo imela a try/catch za kateri koli prejeti krmilnik.

Če pride do napake v krmilniku, se ta ujame v catch blok in pokliče se naslednja funkcija:


const tryCatch = (controller) => async (req, res, next) => {
	try {
		await controller(req, res);
	} catch (error) {
		return next(error);
	}
};
module.exports = tryCatch;

Z try/catch abstrakcijo, lahko svojo kodo preoblikujemo, da bo bolj jedrnata, tako da preskočimo try-catch klavzulo izrecno pri pridobivanju uporabnikov v 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);
	})
);

Uspešno smo abstrahirali logiko poskusi-ulovi in ​​naša koda še vedno deluje kot prej.

Obravnava napak pri preverjanju v Expressu

Za to predstavitev bomo v naši aplikaciji Express ustvarili novo pot za prijavo – za potrditev uporabniškega ID-ja ob prijavi. Najprej bomo namestili joi paket, za pomoč pri ustvarjanju sheme, s katero lahko uveljavimo zahteve:

$ npm i joi

Nato ustvarite shemo, ki je a Joi.object z userId ki mora biti številka in je zahtevana – kar pomeni, da se mora zahteva ujemati z objektom z ID-jem uporabnika na njem.

Lahko uporabimo validate() metoda v objektu sheme za preverjanje veljavnosti vsakega vnosa glede na shemo:


const schema = Joi.object({
	userId: Joi.number().required(),
});

app.post(
	"/login",
	tryCatch(async (req, res) => {
		const {error, value} = schema.validate({});
		if (error) throw error;
	})
);

Če se prazen predmet prenese v validate() metoda, bi bila napaka elegantno obravnavana in sporočilo o napaki bi bilo poslano odjemalcu:

Na konzoli dobimo tudi dostop do a details matriko, ki vključuje različne podrobnosti o napaki, ki se lahko po potrebi sporočijo uporabniku.

Za specifično obravnavo napak pri preverjanju veljavnosti na tak način, da se posreduje ustrezna podrobnost napake na napako pri preverjanju veljavnosti, je mogoče vmesno programsko opremo za obravnavo napak preurediti:


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;

z errorHandler.js zdaj prilagojeno, ko naredimo isto zahtevo s praznim objektom, posredovanim v validate() metoda:

Vodnik za ravnanje z izjemami v Express PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Zdaj imamo dostop do prilagojenega predmeta, ki vrača sporočila na bolj berljiv/prijazen način. Na ta način lahko pošiljamo in obravnavamo različne vrste napak glede na vrsto prihajajoče napake.

zaključek

V tem priročniku smo preučili vse vidike obravnavanja napak Express.js, vključno s tem, kako se privzeto obravnava sinhrona in asinhrona koda, kako ustvariti lastne razrede napak, kako napisati funkcije vmesne programske opreme za obravnavanje napak po meri in zagotoviti next kot končni vodja ulova

Kot pri vsaki nalogi obstajajo tudi najboljše prakse med razvojem, ki vključujejo učinkovito obravnavanje napak, danes pa smo se naučili, kako lahko robustno obravnavamo napake v aplikaciji Express.

Pravilno ravnanje z napakami ne pomeni le skrajšanja časa razvoja z enostavnim iskanjem hroščev in napak, temveč tudi razvoj robustne kodne baze za obsežne aplikacije. V tem priročniku smo videli, kako nastaviti vmesno programsko opremo za obravnavanje operativnih napak. Nekateri drugi načini za izboljšanje obravnave napak vključujejo: nepošiljanje sledi skladov, uglajeno ustavljanje procesov za obravnavo neulovljenih izjem, zagotavljanje ustreznih sporočil o napakah, pošiljanje dnevnikov napak in nastavitev razreda, ki razširja Error razred.

Upam, da so vam bili primeri, ki sem jih uporabil v tej vadnici, prijetni. Zajel sem različne scenarije, na katere bi lahko naleteli, ko pišete aplikacijo Express za uporabo v resničnem svetu glede upravljanja napak. Prosim, povejte mi, če sem kaj zamudil. To nam bo koristilo in tudi meni bo pomagalo izvedeti več. Lep dan in hvala za branje.

Lahko se sklicujete na vso izvorno kodo, uporabljeno v članku o GitHub.

Dodatni viri

Časovni žig:

Več od Stackabuse