Bevezetés
Kivételek és hibák előfordulhatnak, amikor a felhasználók bármilyen alkalmazással interakcióba lépnek, a szoftvermérnökök feladata, hogy megválasszák az esetlegesen felmerülő hibák kezelésének módját – tudatosan vagy tudatlanul. Ennek eredményeként az API-kat az Express segítségével építő háttérfejlesztők azon fáradoznak, hogy hasznos, hatékony és használható API-t hozzanak létre. A legfontosabb az, hogy a hibákat úgy kezeljük, hogy robusztus rendszert építsünk fel, mert ez segít csökkenteni a fejlesztési időt, a közvetlen hibákat, a termelékenységi problémákat, és meghatározza a szoftverfejlesztés sikerét vagy méretezhetőségét.
Naplóznia kell a hibaüzenetet, el kell tiltania a hibát, értesítenie kell a felhasználókat a hibáról, vagy kódot kell írnia a hibák kezelésére? Ne csodálkozz tovább.
Ebben az útmutatóban megtudjuk, hogyan építsünk fel egy robusztus hibakezelő kódbázist az Express alkalmazásokhoz, amely segít észlelni az alkalmazáshibákat, és megteszi az optimális lépéseket az alkalmazások futás közbeni kecsesen meghibásodásának helyreállítására.
Jegyzet: A Postman segítségével teszteljük az API-t a bemutatónkban. Letöltheti a Postás letöltési oldal. Alternatív megoldásként egyszerűen használhatja a böngészőt, a parancssort curl
eszközt, vagy bármilyen más eszközt, amelyet esetleg ismer.
Mi az a hibakezelés?
A szoftverfejlesztésben kétféle kivétel létezik: operatív és a programadó.
- Működési hibák léphetnek fel futás közben, és annak érdekében, hogy megakadályozzuk az alkalmazás hirtelen leállását, ezeket a kivételeket hatékony hibakezelési módszerekkel kecsesen kell kezelnünk.
- A programozási kivételeket a programozó manuálisan dobja ki, ha rendkívüli állapot lép fel.
A működési kivételeket „váratlan, de előre látható” kivételnek tekintheti (például egy index határon túli elérése), a programozási kivételeket pedig „várható és előre látható” kivételeknek (például számformázási kivételnek).
A kivételkezelés a programon belüli hibák megtalálására és kijavítására szolgáló eljárás. A hibakezelés olyan üzeneteket küld, amelyek tartalmazzák a megtörtént hiba típusát és azt a veret, ahol a hiba történt.
Jegyzet: A számítástechnikában a kivételek helyreállíthatók, és jellemzően működési vagy programozási problémákból fakadnak futás közben. A hibák általában külső tényezőkből adódnak, például hardverkorlátozásokból, kapcsolódási problémákból, memóriahiányból stb. A JavaScriptben a kifejezéseket gyakran felcserélhetően használják, és az egyéni kivételek a Error
osztály. A Error
maga az osztály egyaránt jelent hibákat és kivételeket.
Az Expressben a kivételkezelés arra utal, hogy az Express hogyan állítja be magát a szinkron és aszinkron kivételek elkapására és feldolgozására. Az Express kivételkezelésében az a jó, hogy fejlesztőként nem kell saját kivételkezelőket írnia; Az Express alapértelmezett kivételkezelővel érkezik. A kivételkezelő segít a hibák azonosításában és a felhasználó felé történő jelentésében. Különféle orvosi stratégiákat is kínál, és azokat a kivételek enyhítésére valósítja meg.
Bár úgy tűnhet, hogy ez sok dolog a burkolat alatt van, az Express kivételkezelése nem lassítja le a program teljes folyamatát, és nem szünetelteti a végrehajtását.
A kivételkezelés megértése az Expressben
Az Expresshez mellékelt alapértelmezett hibakezelővel egy sor köztes szoftver funkciót tartunk a kezünkben, amelyek segítenek az útvonalkezelők hibáinak automatikus észlelésében. Hamarosan létrehozunk egy projektet, amely az elméletet a gyakorlatba ülteti át arra vonatkozóan, hogyan lehet visszaadni a megfelelő hibákat egy Express alkalmazásban, és hogyan ne szivárogtassunk ki érzékeny információkat.
Köztesszoftver funkció meghatározása Expressben
A hibakezelő köztes szoftver függvények úgy vannak definiálva, hogy elfogadják a Error
az objektum első bemeneti paramétere, majd bármely más köztes szoftver alapértelmezett paramétere: request
, response
és next
Az next()
függvény átugorja az összes jelenlegi köztes szoftvert a router következő hibakezelőjéhez.
A hibakezelés beállítása az Expressben
Futtassa a következő parancsot a terminálon egy Node és Express alkalmazás létrehozásához:
$ mkdir error-handling-express
Az újonnan létrehozott mappában inicializáljunk egy új Node projektet:
$ cd error-handling-express && npm init -y
Ez létrehozza a package.json
fájlt a mappánkban.
Express szerver létrehozásához a Node alkalmazásunkban telepítenünk kell a express
csomag, dotenv
a környezeti változók automatikus betöltéséhez .env
fájl be process.env
tárgy, és nodemon
a csomópont alkalmazás újraindításához, ha fájlváltozást észlel a könyvtárban.
$ npm install express dotenv nodemon
Ezután hozzon létre egy app.js
fájlt a projekt mappájában, amely az alkalmazás indexfájljaként fog szolgálni.
Most, hogy telepítettük az összes szükséges függőséget az Express alkalmazásunkhoz, be kell állítanunk a szkriptet az alkalmazás olvasásához a package.json
fájlt. Ennek eléréséhez a package.json
fájlt, így a scripts
az objektum az alábbi képen látható:
"scripts": {
"start": "nodemon app.js"
},
Alternatív megoldásként kihagyhatja a használatát nodemon
, és használja node app.js
helyette.
Express szerver beállítása
A szerver beállításához először be kell importálnunk a különböző csomagokat app.js
. Létrehozunk továbbá a .env
fájl a projektkönyvtárban – az alkalmazás összes környezeti változójának tárolásához:
const express = require('express')
require('dotenv').config
PORT=4000
Meghatároztuk az alkalmazás portszámát .env
, amelyet betölt és elolvas dotenv
, és később is elérhető.
Az Express Server inicializálása
Most inicializálnunk kell az Express szervert, és rá kell kényszerítenünk az alkalmazásunkra, hogy figyeljen az alkalmazás portszámára, valamint egy tesztútvonal kérésére – /test
. Frissítsünk app.js
, az importálási utasítások alatt:
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}`);
});
Innentől kezdve megtanuljuk, hogyan kezeljük az esetleges működési hibák különféle használati eseteit az Expressben.
A nem található hibák kezelése az Expressben
Tegyük fel, hogy le kell kérnie az összes felhasználót egy felhasználói adatbázisból, hatékonyan kezelheti a lehetséges hibaforgatókönyvet, ha nincs adat az adatbázisban, ha a logikát egy try/catch
blokk – abban a reményben, hogy elkaphat minden olyan hibát, amely kivetülhet a catch
Blokk:
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
});
});
Ennek eredményeként:
User not found
Most, amikor ez a kérés megtörténik (a Postman segítségével tesztelheti), és nincs felhasználó az adatbázisban, a kliens hibaüzenetet kap, amely szerint „A felhasználó nem található”. Azt is észre fogja venni, hogy a hiba a konzolban is naplózásra kerül.
A hibakezelés optimalizálása hibakezelő köztes szoftverrel
A fejlesztést úgy optimalizálhatjuk, hogy létrehozunk egy hibakezelő köztes szoftvert, amely az összes meghatározott útvonal végén jönne, így ha valamelyik útvonalban hiba történik, az Express automatikusan megnézi a következő köztes szoftvert, és folyamatosan lefelé halad a listán. amíg el nem éri a hibakezelőt. A hibakezelő feldolgozza a hibát, és választ is küld az ügyfélnek.
Tekintse meg gyakorlatias, gyakorlati útmutatónkat a Git tanulásához, amely tartalmazza a bevált gyakorlatokat, az iparág által elfogadott szabványokat és a mellékelt csalólapot. Hagyd abba a guglizást a Git parancsokkal, és valójában tanulni meg!
A kezdéshez hozzon létre egy mappát, melynek neve middleware
a projektkönyvtárban és ebben a mappában hozzon létre egy fájlt errorHandler.js
amely meghatározza a hibakezelőt:
const errorHandler = (error, req, res, next) => {
console.log(error);
res.status(400).send(error.message);
}
module.exports = errorHandler;
Köztesszoftver funkciónkban tudattuk az Expresszel, hogy ez nem egy alapvető köztes szoftver funkció, hanem egy hibakezelő, hozzáadva a error
paraméter a 3 alapparaméter előtt.
Most a hibakezelőt fogjuk használni a bemutatónkban app.js
és kezelje a felhasználók lekérésének kezdeti hibáját a hibakezelő köztes szoftverrel, az alábbiak szerint:
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);
Még jobban optimalizálhatjuk kódunkat, ha absztrakciót hozunk létre a körül try/catch
logika. Ezt úgy érhetjük el, hogy a projektkönyvtárban egy új mappát hozunk létre utils
, és benne hozzon létre egy fájlt tryCatch.js
.
Az elvonatkoztatáshoz a try-catch
logika – definiálhatunk egy függvényt, amely elfogad egy másik függvényt (az úgynevezett ellenőr) paraméterként, és an async
funkció, amely a try/catch
bármely fogadott vezérlőhöz.
Ha hiba lép fel a vezérlőben, azt a vezérlő elkapja catch
blokkot, és a következő függvény neve:
const tryCatch = (controller) => async (req, res, next) => {
try {
await controller(req, res);
} catch (error) {
return next(error);
}
};
module.exports = tryCatch;
Aktivitáskövető try/catch
absztrakciót, a kód kihagyásával újrafaktorizálhatjuk, hogy tömörebb legyen try-catch
záradék kifejezetten a felhasználók lekérésekor a 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);
})
);
Sikeresen absztraháltuk a try-catch logikát, és a kódunk továbbra is ugyanúgy működik, mint korábban.
Érvényesítési hibák kezelése Expressben
Ehhez a demóhoz létrehozunk egy új útvonalat az Express alkalmazásunkban a bejelentkezéshez – a felhasználói azonosító érvényesítéséhez bejelentkezéskor. Először telepítjük a joi
csomag, amely segít egy séma létrehozásában, amellyel a követelményeket érvényesíthetjük:
$ npm i joi
Ezután hozzon létre egy sémát, amely a Joi.object
val,-vel userId
aminek számnak kell lennie, és kötelező – vagyis a kérésnek meg kell egyeznie egy felhasználói azonosítóval rendelkező objektummal.
Használhatjuk a validate()
metódus a séma objektumban, hogy minden bemenetet érvényesítsen a sémával szemben:
const schema = Joi.object({
userId: Joi.number().required(),
});
app.post(
"/login",
tryCatch(async (req, res) => {
const {error, value} = schema.validate({});
if (error) throw error;
})
);
Ha egy üres objektumot adunk át a validate()
módszerrel a hiba kecsesen kezelhető, és a hibaüzenet elküldésre kerül a kliensnek:
A konzolon is hozzáférünk a details
tömb, amely különféle részleteket tartalmaz a hibáról, amelyeket szükség esetén közölni lehet a felhasználóval.
Az érvényesítési hibák specifikus kezeléséhez oly módon, hogy a megfelelő hibarészletet érvényesítési hibánként átadja, a hibakezelő köztes szoftvert át lehet alakítani:
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;
A errorHandler.js
most testreszabott, amikor ugyanazt a kérést egy üres objektummal adjuk át a validate()
eljárás:
Mostantól hozzáférünk egy testreszabott objektumhoz, amely olvashatóbb/barátságosabb módon küldi vissza az üzeneteket. Ily módon különböző típusú hibákat tudunk küldeni és kezelni a beérkező hiba típusától függően.
Következtetés
Ebben az útmutatóban az Express.js hibakezelésének minden aspektusát áttekintettük, beleértve a szinkron és aszinkron kódok alapértelmezés szerinti kezelését, a saját hibaosztályok létrehozását, az egyéni hibakezelési köztes szoftverek írását és biztosítását. next
mint a végső fogáskezelő
Mint minden feladatnál, a fejlesztés során is vannak bevált gyakorlatok, amelyek magukban foglalják a hatékony hibakezelést, és ma megtanultuk, hogyan kezelhetjük robusztus módon a hibákat egy Express alkalmazásban.
A hibák megfelelő kezelése nem csak a fejlesztési idő csökkentését jelenti a hibák és hibák egyszerű megtalálásával, hanem egy robusztus kódbázis fejlesztését is jelenti nagyméretű alkalmazásokhoz. Ebben az útmutatóban láthattuk, hogyan állíthat be köztes szoftvert a működési hibák kezelésére. A hibakezelés javításának további módjai közé tartozik: a veremnyomok elküldésének mellőzése, a folyamatok kecses leállítása a fel nem fogott kivételek kezelése érdekében, megfelelő hibaüzenetek biztosítása, hibanaplók küldése és olyan osztály beállítása, amely kiterjeszti a Error
osztály.
Remélem, hogy az oktatóanyagban használt példák élvezetesek voltak az Ön számára. Különféle forgatókönyvekkel foglalkoztam, amelyekkel találkozhat, amikor egy Express alkalmazást ír a valós világban a hibakezeléssel kapcsolatban. Kérem, jelezze, ha valamit kihagytam. Ez hasznunkra válik, és segít nekem is többet tanulni. További szép napot és köszönöm, hogy olvastál.
A cikkben használt összes forráskódra hivatkozhat GitHub.