Οδηγός χειρισμού εξαιρέσεων στο Express PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Οδηγός χειρισμού εξαιρέσεων στο Express

Εισαγωγή

Εξαιρέσεις και σφάλματα είναι βέβαιο ότι θα προκύψουν όταν οι χρήστες αλληλεπιδρούν με οποιαδήποτε εφαρμογή, εναπόκειται στους μηχανικούς λογισμικού να επιλέξουν ένα μέσο για να χειριστούν οποιοδήποτε σφάλμα που μπορεί να προκύψει - εν γνώσει ή εν αγνοία του. Ως αποτέλεσμα, οι προγραμματιστές backend που δημιουργούν API με το Express εργάζονται για να διασφαλίσουν ότι δημιουργούν ένα χρήσιμο, αποτελεσματικό και χρησιμοποιήσιμο API. Αυτό που έχει μεγαλύτερη σημασία είναι ο χειρισμός των σφαλμάτων με τέτοιο τρόπο ώστε να δημιουργηθεί ένα ισχυρό σύστημα, διότι αυτό συμβάλλει στη μείωση του χρόνου ανάπτυξης, των τελικών σφαλμάτων, των προβλημάτων παραγωγικότητας και καθορίζει την επιτυχία ή την επεκτασιμότητα της ανάπτυξης λογισμικού.

Χρειάζεται να καταγράψετε το μήνυμα σφάλματος, να αποκρύψετε το σφάλμα, να ειδοποιήσετε τους χρήστες για το σφάλμα ή να γράψετε κώδικα για τη διαχείριση σφαλμάτων; Μην αναρωτιέσαι άλλο.

Σε αυτόν τον οδηγό, θα μάθουμε πώς να δημιουργήσουμε μια ισχυρή βάση κώδικα διαχείρισης σφαλμάτων για εφαρμογές Express, η οποία θα βοηθήσει στον εντοπισμό σφαλμάτων εφαρμογών και στη λήψη βέλτιστων ενεργειών για την ανάκτηση οποιασδήποτε εφαρμογής από χαριτωμένη αποτυχία κατά τη διάρκεια του χρόνου εκτέλεσης.

Σημείωση: Θα χρησιμοποιήσουμε το Postman για να δοκιμάσουμε το API στο demo μας. Μπορείτε να το κατεβάσετε στο Σελίδα λήψης ταχυδρόμων. Εναλλακτικά, μπορείτε απλά να χρησιμοποιήσετε το πρόγραμμα περιήγησης, τη γραμμή εντολών curl εργαλείο ή οποιοδήποτε άλλο εργαλείο που ίσως γνωρίζετε.

Τι είναι ο χειρισμός σφαλμάτων;

Στην ανάπτυξη λογισμικού, υπάρχουν δύο διαφορετικά είδη εξαιρέσεων: επιχειρήσεων και προγραμματικός.

  • Ενδέχεται να προκύψουν λειτουργικές αποτυχίες κατά τη διάρκεια του χρόνου εκτέλεσης και προκειμένου να αποφευχθεί ο απότομος τερματισμός της εφαρμογής, πρέπει να χειριστούμε με χάρη αυτές τις εξαιρέσεις μέσω αποτελεσματικών μεθόδων διαχείρισης σφαλμάτων.
  • Οι εξαιρέσεις προγραμματίζονται με μη αυτόματο τρόπο από έναν προγραμματιστή, όταν προκύπτει μια εξαιρετική κατάσταση.

Μπορείτε να σκεφτείτε τις λειτουργικές εξαιρέσεις ως "απροσδόκητες, αλλά προβλεπόμενες" εξαιρέσεις (όπως η πρόσβαση σε ένα ευρετήριο εκτός ορίων) και οι εξαιρέσεις μέσω προγραμματισμού ως "αναμενόμενες και προβλεπόμενες" εξαιρέσεις (όπως μια εξαίρεση μορφοποίησης αριθμού).

Ο χειρισμός εξαίρεσης είναι η διαδικασία που χρησιμοποιείται για την εύρεση και τη διόρθωση ελαττωμάτων σε ένα πρόγραμμα. Ο χειρισμός σφαλμάτων στέλνει μηνύματα που περιλαμβάνουν τον τύπο του σφάλματος που συνέβη και τη στοίβα όπου συνέβη το σφάλμα.

Σημείωση: Στην επιστήμη των υπολογιστών, οι εξαιρέσεις μπορούν να ανακτηθούν και συνήθως προέρχονται από λειτουργικά ή προγραμματικά ζητήματα κατά τη διάρκεια του χρόνου εκτέλεσης. Τα σφάλματα συνήθως προκύπτουν από εξωτερικούς παράγοντες, όπως περιορισμούς υλικού, προβλήματα συνδεσιμότητας, έλλειψη μνήμης κ.λπ. Στο JavaScript, οι όροι συχνά χρησιμοποιούνται εναλλακτικά και οι προσαρμοσμένες εξαιρέσεις προέρχονται από το Error τάξη. ο Error Η ίδια η κλάση αντιπροσωπεύει τόσο σφάλματα όσο και εξαιρέσεις.

Στο Express, ο χειρισμός εξαιρέσεων αναφέρεται στον τρόπο με τον οποίο το Express ρυθμίζεται ώστε να εντοπίζει και να επεξεργάζεται σύγχρονες και ασύγχρονες εξαιρέσεις. Το καλό με τον χειρισμό εξαιρέσεων στο Express είναι ότι ως προγραμματιστής, δεν χρειάζεται να γράψετε τους δικούς σας χειριστές εξαιρέσεων. Το Express συνοδεύεται από έναν προεπιλεγμένο χειριστή εξαιρέσεων. Ο χειριστής εξαιρέσεων βοηθά στον εντοπισμό σφαλμάτων και στην αναφορά τους στον χρήστη. Παρέχει επίσης διάφορες διορθωτικές στρατηγικές και τις εφαρμόζει για να μετριάσει τις εξαιρέσεις.

Αν και αυτά μπορεί να φαίνονται σαν πολλά πράγματα κάτω από την κουκούλα, ο χειρισμός εξαιρέσεων στο Express δεν επιβραδύνει τη συνολική διαδικασία ενός προγράμματος ούτε διακόπτει την εκτέλεσή του.

Κατανόηση του χειρισμού εξαιρέσεων στο Express

Με τον προεπιλεγμένο χειριστή σφαλμάτων που συνοδεύει το Express, έχουμε στα χέρια μας ένα σύνολο λειτουργιών ενδιάμεσου λογισμικού που βοηθούν στην αυτόματη αναγνώριση σφαλμάτων στους χειριστές διαδρομών. Σύντομα, θα δημιουργήσουμε ένα έργο για την εφαρμογή της θεωρίας σχετικά με το πώς να επιστρέφετε σωστά σφάλματα σε μια εφαρμογή Express και πώς να μην διαρρέετε ευαίσθητες πληροφορίες.

Ορισμός συνάρτησης ενδιάμεσου λογισμικού στο Express

Οι συναρτήσεις ενδιάμεσου λογισμικού χειρισμού σφαλμάτων ορίζονται με τέτοιο τρόπο ώστε να δέχονται ένα Error αντικείμενο ως η πρώτη παράμετρος εισόδου, ακολουθούμενη από τις προεπιλεγμένες παραμέτρους οποιασδήποτε άλλης συνάρτησης ενδιάμεσου λογισμικού: request, response, να next. ο next() Η λειτουργία παρακάμπτει όλο το τρέχον ενδιάμεσο λογισμικό στον επόμενο χειριστή σφαλμάτων για το δρομολογητή.

Ρύθμιση διαχείρισης σφαλμάτων στο Express

Εκτελέστε την ακόλουθη εντολή στο τερματικό σας για να δημιουργήσετε μια εφαρμογή Node and Express:

$ mkdir error-handling-express

Στον φάκελο που δημιουργήθηκε πρόσφατα, ας αρχικοποιήσουμε ένα νέο έργο Node:

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

Αυτό δημιουργεί ένα package.json αρχείο στον φάκελό μας.

Για να δημιουργήσουμε έναν διακομιστή Express στην εφαρμογή Node, πρέπει να εγκαταστήσουμε το express πακέτο, dotenv για αυτόματη φόρτωση μεταβλητών περιβάλλοντος .env αρχείου σε process.env αντικείμενο, και nodemon για επανεκκίνηση της εφαρμογής κόμβου εάν σημειωθεί αλλαγή αρχείου στον κατάλογο.

$ npm install express dotenv nodemon

Στη συνέχεια, δημιουργήστε ένα app.js αρχείο στον φάκελο του έργου που θα χρησιμεύσει ως αρχείο ευρετηρίου για την εφαρμογή.

Τώρα που έχουμε εγκαταστήσει όλες τις απαραίτητες εξαρτήσεις για την εφαρμογή Express, πρέπει να ρυθμίσουμε το σενάριο για την ανάγνωση της εφαρμογής στο package.json αρχείο. Για να επιτευχθεί αυτό, το package.json αρχείο, έτσι ώστε το scripts το αντικείμενο είναι όπως φαίνεται παρακάτω:

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

Εναλλακτικά, μπορείτε να παραλείψετε τη χρήση nodemonκαι χρησιμοποιήστε node app.js Αντιθέτως.

Ρύθμιση διακομιστή Express

Για να ρυθμίσουμε τον διακομιστή, πρέπει πρώτα να εισάγουμε τα διάφορα πακέτα app.js. Θα δημιουργήσουμε επίσης ένα .env αρχείο στον κατάλογο του έργου – για αποθήκευση όλων των μεταβλητών περιβάλλοντος για την εφαρμογή:



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

PORT=4000 

Έχουμε ορίσει τον αριθμό θύρας για την εφαρμογή .env, το οποίο φορτώνεται και διαβάζεται από dotenv, και μπορείτε να προσπελάσετε αργότερα.

Εκκίνηση του διακομιστή Express

Τώρα, πρέπει να αρχικοποιήσουμε τον διακομιστή Express και να κάνουμε την εφαρμογή μας να ακούσει τον αριθμό της θύρας εφαρμογής, μαζί με ένα αίτημα για μια δοκιμαστική διαδρομή – /test. Ας ενημερώσουμε app.js, κάτω από τις δηλώσεις εισαγωγής:


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

Από εδώ και πέρα, θα μάθουμε πώς να χειριζόμαστε διάφορες περιπτώσεις χρήσης λειτουργικών σφαλμάτων που μπορεί να παρουσιαστούν, στο Express.

Διαχείριση σφαλμάτων που δεν βρέθηκαν στο Express

Ας υποθέσουμε ότι πρέπει να ανακτήσετε όλους τους χρήστες από μια βάση δεδομένων χρηστών, μπορείτε να χειριστείτε αποτελεσματικά ένα πιθανό σενάριο σφάλματος όπου δεν υπάρχουν δεδομένα στη βάση δεδομένων, τυλίγοντας τη λογική σε ένα try/catch μπλοκ – ελπίζοντας να συλλάβουμε οποιοδήποτε σφάλμα που θα μπορούσε να προβληθεί στο catch block:


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

Αυτο εχει ως αποτελεσμα:

User not found

Τώρα, όταν υποβάλλεται αυτό το αίτημα (μπορείτε να δοκιμάσετε χρησιμοποιώντας τον Postman) και δεν υπάρχει χρήστης στη βάση δεδομένων, ο πελάτης λαμβάνει ένα μήνυμα σφάλματος που λέει "Ο χρήστης δεν βρέθηκε". Επίσης, θα παρατηρήσετε ότι το σφάλμα καταγράφεται και στην κονσόλα.

Βελτιστοποίηση χειρισμού σφαλμάτων με ενδιάμεσο λογισμικό χειρισμού σφαλμάτων

Μπορούμε να βελτιστοποιήσουμε την ανάπτυξη δημιουργώντας ένα ενδιάμεσο λογισμικό διαχείρισης σφαλμάτων που θα ερχόταν στο τέλος όλων των καθορισμένων διαδρομών, έτσι ώστε εάν εμφανιστεί ένα σφάλμα σε μία από τις διαδρομές, το Express θα κοιτάξει αυτόματα το επόμενο ενδιάμεσο λογισμικό και θα συνεχίσει να πηγαίνει προς τα κάτω στη λίστα μέχρι να φτάσει στο πρόγραμμα χειρισμού σφαλμάτων. Ο χειριστής σφαλμάτων θα επεξεργαστεί το σφάλμα και θα στείλει επίσης μια απάντηση στον πελάτη.

Ρίξτε μια ματιά στον πρακτικό μας οδηγό για την εκμάθηση του Git, με βέλτιστες πρακτικές, πρότυπα αποδεκτά από τον κλάδο και συμπεριλαμβανόμενο φύλλο εξαπάτησης. Σταματήστε τις εντολές του Git στο Google και πραγματικά μαθαίνουν το!

Για να ξεκινήσετε, δημιουργήστε έναν φάκελο που ονομάζεται middleware στον κατάλογο του έργου και σε αυτόν τον φάκελο, δημιουργήστε ένα αρχείο που ονομάζεται errorHandler.js που ορίζει το πρόγραμμα χειρισμού σφαλμάτων:

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

Στη λειτουργία ενδιάμεσου λογισμικού, έχουμε ενημερώσει την Express ότι αυτή δεν είναι μια βασική λειτουργία ενδιάμεσου λογισμικού, αλλά ένας χειριστής σφαλμάτων, προσθέτοντας το error παράμετρος πριν από τις 3 βασικές παραμέτρους.

Τώρα, θα χρησιμοποιήσουμε το πρόγραμμα χειρισμού σφαλμάτων στο demo μας app.js και να χειριστεί το αρχικό σφάλμα της ανάκτησης χρηστών με το ενδιάμεσο λογισμικό διαχείρισης σφαλμάτων, όπως φαίνεται παρακάτω:


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

Μπορούμε να βελτιστοποιήσουμε τον κώδικά μας ακόμα περισσότερο, δημιουργώντας μια αφαίρεση γύρω από το try/catch λογική. Μπορούμε να το πετύχουμε αυτό δημιουργώντας έναν νέο φάκελο στον κατάλογο του έργου που ονομάζεται utils, και σε αυτό, δημιουργήστε ένα αρχείο που ονομάζεται tryCatch.js.

Για να αφαιρέσετε το try-catch λογική – μπορούμε να ορίσουμε μια συνάρτηση που δέχεται μια άλλη συνάρτηση (γνωστή ως το ελεγκτής) ως παράμετρό του και επιστρέφει an async συνάρτηση που θα κρατήσει α try/catch για οποιονδήποτε ελεγκτή που ελήφθη.

Εάν παρουσιαστεί κάποιο σφάλμα στον ελεγκτή, καταγράφεται στο catch μπλοκ και η επόμενη συνάρτηση ονομάζεται:


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

Με την try/catch αφαίρεση, μπορούμε να αναδιατυπώσουμε τον κώδικά μας για να τον κάνουμε πιο συνοπτικό παρακάμπτοντας το try-catch ρήτρα ρητά κατά την ανάκτηση χρηστών στο 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);
	})
);

Έχουμε αφαιρέσει με επιτυχία τη λογική του try-catch και ο κώδικάς μας εξακολουθεί να λειτουργεί όπως πριν.

Χειρισμός σφαλμάτων επικύρωσης στο Express

Για αυτήν την επίδειξη, θα δημιουργήσουμε μια νέα διαδρομή στην εφαρμογή Express μας για σύνδεση - για να επικυρώσουμε ένα αναγνωριστικό χρήστη κατά τη σύνδεση. Αρχικά, θα εγκαταστήσουμε το joi πακέτο, για να βοηθήσει στη δημιουργία ενός σχήματος, με το οποίο μπορούμε να επιβάλλουμε απαιτήσεις:

$ npm i joi

Στη συνέχεια, δημιουργήστε ένα σχήμα που είναι α Joi.object με userId που πρέπει να είναι αριθμός και απαιτείται – που σημαίνει ότι το αίτημα πρέπει να ταιριάζει με ένα αντικείμενο με ένα αναγνωριστικό χρήστη πάνω του.

Μπορούμε να χρησιμοποιήσουμε το validate() μέθοδος στο αντικείμενο σχήματος για την επικύρωση κάθε εισόδου έναντι του σχήματος:


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

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

Εάν ένα κενό αντικείμενο περάσει στο validate() μέθοδος, το σφάλμα θα αντιμετωπιζόταν με ευγενικό τρόπο και το μήνυμα σφάλματος θα αποσταλεί στον πελάτη:

Στην κονσόλα, έχουμε επίσης πρόσβαση σε ένα details πίνακας που περιλαμβάνει διάφορες λεπτομέρειες σχετικά με το σφάλμα που θα μπορούσαν να κοινοποιηθούν στον χρήστη εάν χρειαστεί.

Για τον συγκεκριμένο χειρισμό σφαλμάτων επικύρωσης με τέτοιο τρόπο ώστε να μεταβιβάζεται η κατάλληλη λεπτομέρεια σφάλματος ανά σφάλμα επικύρωσης, το ενδιάμεσο λογισμικό του χειριστή σφαλμάτων μπορεί να ανακατασκευαστεί:


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;

Με errorHandler.js τώρα προσαρμοσμένο, όταν κάνουμε το ίδιο αίτημα με ένα κενό αντικείμενο που έχει περάσει στο validate() μέθοδος:

Οδηγός χειρισμού εξαιρέσεων στο Express PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Τώρα έχουμε πρόσβαση σε ένα προσαρμοσμένο αντικείμενο που επιστρέφει μηνύματα με πιο ευανάγνωστο/φιλικό τρόπο. Με αυτόν τον τρόπο, είμαστε σε θέση να στέλνουμε και να χειριζόμαστε διαφορετικά είδη σφαλμάτων με βάση το είδος του σφάλματος που εμφανίζεται.

Συμπέρασμα

Σε αυτόν τον οδηγό, εξετάσαμε κάθε πτυχή του χειρισμού σφαλμάτων του Express.js, συμπεριλαμβανομένου του τρόπου χειρισμού του σύγχρονου και του ασύγχρονου κώδικα από προεπιλογή, του τρόπου δημιουργίας των δικών σας κατηγοριών σφαλμάτων, του τρόπου σύνταξης προσαρμοσμένων λειτουργιών ενδιάμεσου λογισμικού διαχείρισης σφαλμάτων και της παροχής next ως ο τελικός χειριστής αλιευμάτων

Όπως με κάθε εργασία εκεί έξω, υπάρχουν επίσης βέλτιστες πρακτικές κατά την ανάπτυξη που περιλαμβάνουν αποτελεσματικό χειρισμό σφαλμάτων και σήμερα μάθαμε πώς μπορούμε να χειριστούμε τα σφάλματα σε μια εφαρμογή Express με άρτιο τρόπο.

Ο σωστός χειρισμός των σφαλμάτων δεν σημαίνει μόνο μείωση του χρόνου ανάπτυξης με την εύκολη εύρεση σφαλμάτων και σφαλμάτων, αλλά και ανάπτυξη μιας ισχυρής βάσης κωδικών για εφαρμογές μεγάλης κλίμακας. Σε αυτόν τον οδηγό, έχουμε δει πώς να ρυθμίσετε το ενδιάμεσο λογισμικό για τον χειρισμό λειτουργικών σφαλμάτων. Μερικοί άλλοι τρόποι βελτίωσης του χειρισμού σφαλμάτων περιλαμβάνουν: μη αποστολή ιχνών στοίβας, διακοπή διεργασιών με χάρη για χειρισμό μη εντοπισμένων εξαιρέσεων, παροχή κατάλληλων μηνυμάτων σφάλματος, αποστολή αρχείων καταγραφής σφαλμάτων και ρύθμιση κλάσης που επεκτείνει το Error τάξη.

Ελπίζω ότι τα παραδείγματα που χρησιμοποίησα σε αυτό το σεμινάριο ήταν ευχάριστα για εσάς. Κάλυψα διάφορα σενάρια που θα μπορούσατε να συναντήσετε κατά τη σύνταξη μιας εφαρμογής Express για χρήση στον πραγματικό κόσμο σχετικά με τη διαχείριση σφαλμάτων. Παρακαλώ, ενημερώστε με αν υπάρχει κάτι που έχασα. Θα μας ωφελήσει και θα με βοηθήσει επίσης να μάθω περισσότερα. Καλή σας μέρα και ευχαριστώ για την ανάγνωση.

Μπορείτε να ανατρέξετε σε όλο τον πηγαίο κώδικα που χρησιμοποιείται στο άρθρο για Github.

Επιπρόσθετοι πόροι

Σφραγίδα ώρας:

Περισσότερα από Stackabuse