esittely
Poikkeuksia ja virheitä tapahtuu väistämättä, kun käyttäjät ovat vuorovaikutuksessa minkä tahansa sovelluksen kanssa. Ohjelmistoinsinöörien on valittava keino käsitellä mahdollisia virheitä – tietoisesti tai tietämättään. Tämän seurauksena taustakehittäjät, jotka rakentavat sovellusliittymiä Expressin avulla, joutuvat työskentelemään varmistaakseen, että he rakentavat hyödyllisen, tehokkaan ja käyttökelpoisen API:n. Tärkeintä on käsitellä virheitä siten, että rakennetaan kestävä järjestelmä, koska tämä auttaa vähentämään kehitysaikaa, suoria virheitä, tuottavuusongelmia ja määrää ohjelmistokehityksen onnistumisen tai skaalautuvuuden.
Tarvitseeko sinun kirjata virhesanoma, vaimentaa virhe, ilmoittaa käyttäjille virheestä tai kirjoittaa koodia virheiden käsittelemiseksi? Älä ihmettele enempää.
Tässä oppaassa opimme rakentamaan vankan virheiden käsittelyn koodikannan Express-sovelluksille, jotka auttavat havaitsemaan sovellusvirheet ja toteuttamaan optimaaliset toimet sovelluksen palauttamiseksi sulavasti epäonnistuneista ajon aikana.
Huomautus: Käytämme Postmania API:n testaamiseen demossamme. Voit ladata sen osoitteessa Postman lataussivu. Vaihtoehtoisesti voit käyttää selainta, komentoriviä curl
työkalu tai jokin muu sinulle tuttu työkalu.
Mitä on virheiden käsittely?
Ohjelmistokehityksessä on kahdenlaisia poikkeuksia: toiminta- ja ohjelmallinen.
- Toimintahäiriöitä saattaa ilmetä ajon aikana, ja jotta sovellus ei katkea äkillisesti, meidän on käsiteltävä nämä poikkeukset sulavasti tehokkaiden virheenkäsittelymenetelmien avulla.
- Ohjelmoija heittää ohjelmoitavat poikkeukset manuaalisesti, kun poikkeustila syntyy.
Voit ajatella toiminnallisia poikkeuksia "odottamattomina, mutta ennakoimattomina" poikkeuksina (kuten hakemiston käyttö rajojen ulkopuolella) ja ohjelmallisia poikkeuksia "odotettuina ja ennakoituina" poikkeuksina (kuten numeromuotoilupoikkeus).
Poikkeuskäsittely on menettely, jota käytetään ohjelman vikojen etsimiseen ja korjaamiseen. Virheenkäsittely lähettää viestejä, jotka sisältävät tapahtuneen virheen tyypin ja pinon, jossa virhe tapahtui.
Huomautus: Tietojenkäsittelytieteessä poikkeukset ovat palautettavissa, ja ne johtuvat tyypillisesti joko toiminnallisista tai ohjelmallisista ongelmista suorituksen aikana. Virheet syntyvät yleensä ulkoisista tekijöistä, kuten laitteistorajoituksista, yhteysongelmista, muistin puutteesta jne. JavaScriptissä termejä käytetään usein vaihtokelpoisina, ja mukautetut poikkeukset johdetaan Error
luokassa. Error
luokka itsessään edustaa sekä virheitä että poikkeuksia.
Expressissä poikkeusten käsittely viittaa siihen, kuinka Express määrittää itsensä sieppaamaan ja käsittelemään synkronisia ja asynkronisia poikkeuksia. Expressin poikkeuskäsittelyn hyvä puoli on, että kehittäjänä sinun ei tarvitse kirjoittaa omia poikkeuskäsittelijöitä. Expressin mukana tulee oletuspoikkeuskäsittelijä. Poikkeuskäsittelijä auttaa tunnistamaan virheet ja raportoimaan niistä käyttäjälle. Se tarjoaa myös erilaisia korjausstrategioita ja toteuttaa niitä poikkeuksien lieventämiseksi.
Vaikka nämä saattavat vaikuttaa siltä, että monet asiat menevät konepellin alle, poikkeusten käsittely Expressissä ei hidasta ohjelman yleistä prosessia tai keskeytä sen suorittamista.
Poikkeuskäsittelyn ymmärtäminen Expressissä
Expressin mukana tulevalla oletusvirhekäsittelijällä meillä on käsissämme joukko väliohjelmistotoimintoja, jotka auttavat havaitsemaan virheet automaattisesti reitinkäsittelijöissä. Luomme pian projektin teorian toteuttamiseksi käytännössä siitä, kuinka Express-sovelluksessa voidaan palauttaa oikeat virheet ja miten arkaluonteisia tietoja ei vuodata.
Väliohjelmistotoiminnon määrittäminen Expressissä
Virheenkäsittelyn väliohjelmistotoiminnot on määritelty siten, että ne hyväksyvät an Error
objekti ensimmäisenä syöttöparametrina, jonka jälkeen minkä tahansa muun väliohjelmistotoiminnon oletusparametrit: request
, response
ja next
. next()
-toiminto ohittaa kaikki nykyiset väliohjelmistot reitittimen seuraavaan virheenkäsittelyohjelmaan.
Virheenkäsittelyn määrittäminen Expressissä
Suorita seuraava komento päätteessäsi luodaksesi Node and Express -sovelluksen:
$ mkdir error-handling-express
Alustetaan uusi Node-projekti äskettäin luodussa kansiossa:
$ cd error-handling-express && npm init -y
Tämä luo a package.json
tiedosto kansiossamme.
Express-palvelimen luomiseksi Node-sovelluksessamme meidän on asennettava express
paketti, dotenv
ympäristömuuttujien automaattista lataamista varten .env
tiedosto process.env
esine ja nodemon
solmusovelluksen uudelleenkäynnistämiseksi, jos tiedostomuutos havaitaan hakemistossa.
$ npm install express dotenv nodemon
Luo seuraavaksi an app.js
tiedosto projektikansioon, joka toimii sovelluksen hakemistotiedostona.
Nyt kun olemme asentaneet kaikki tarvittavat riippuvuudet Express-sovelluksellemme, meidän on määritettävä komentosarja sovelluksen lukemista varten package.json
tiedosto. Sen saavuttamiseksi package.json
tiedosto, jotta scripts
objekti on alla olevan kuvan mukainen:
"scripts": {
"start": "nodemon app.js"
},
Vaihtoehtoisesti voit ohittaa käytön nodemon
, ja käytä node app.js
sen sijaan.
Express-palvelimen määrittäminen
Palvelimen määrittämistä varten meidän on ensin tuotava eri paketit sisään app.js
. Luomme myös a .env
tiedosto projektihakemistossa – tallentaaksesi kaikki sovelluksen ympäristömuuttujat:
const express = require('express')
require('dotenv').config
PORT=4000
Olemme määrittäneet sovelluksen porttinumeron .env
, jonka lataa ja lukee dotenv
, ja niitä voi käyttää myöhemmin.
Express-palvelimen alustus
Nyt meidän on alustettava Express-palvelin ja saatava sovelluksemme kuuntelemaan sovelluksen porttinumeroa sekä pyyntö testireitille - /test
. Päivitellään app.js
, tuontilausekkeiden alla:
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}`);
});
Tästä eteenpäin opimme käsittelemään erilaisia käyttötapauksia, joissa voidaan kohdata toimintavirheitä Expressissä.
Ei löydy -virheiden käsittely Expressissä
Oletetaan, että sinun on noudettava kaikki käyttäjät käyttäjätietokannasta, voit käsitellä tehokkaasti mahdollisen virhetilanteen, jossa tietokannassa ei ole tietoja, käärimällä logiikan try/catch
lohko – toivoen saavansa kiinni mahdollisista virheistä catch
lohko:
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
});
});
Tämä johtaa:
User not found
Nyt kun tämä pyyntö tehdään (voit testata Postmanilla) eikä tietokannassa ole yhtään käyttäjää, asiakas saa virheilmoituksen "Käyttäjää ei löydy". Huomaat myös, että virhe kirjataan myös konsoliin.
Virheenkäsittelyn optimointi virheiden käsittelyn väliohjelmistolla
Voimme optimoida kehityksen luomalla virheenkäsittelijän väliohjelmiston, joka tulee kaikkien määritettyjen reittien loppuun, jolloin jos jollekin reitille tulee virhe, Express näkee automaattisesti seuraavan väliohjelmiston ja jatkaa listaa alaspäin. kunnes se saavuttaa virheenkäsittelijän. Virheenkäsittelijä käsittelee virheen ja lähettää myös vastauksen takaisin asiakkaalle.
Tutustu käytännönläheiseen, käytännölliseen Gitin oppimisoppaaseemme, jossa on parhaat käytännöt, alan hyväksymät standardit ja mukana tuleva huijauslehti. Lopeta Git-komentojen googlailu ja oikeastaan oppia se!
Aloita luomalla kansio nimeltä middleware
luo projektihakemistoon ja tähän kansioon tiedosto nimeltä errorHandler.js
joka määrittää virheenkäsittelijän:
const errorHandler = (error, req, res, next) => {
console.log(error);
res.status(400).send(error.message);
}
module.exports = errorHandler;
Väliohjelmistotoiminnossamme olemme ilmoittaneet Expressille, että tämä ei ole väliohjelmiston perustoiminto, vaan virhekäsittelijä, lisäämällä error
parametri ennen kolmea perusparametria.
Nyt käytämme virheenkäsittelijää esittelyssämme app.js
ja käsittelemään alkuperäisen virheen haettaessa käyttäjiä virheenkäsittelyn väliohjelmistolla, kuten alla on esitetty:
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);
Voimme optimoida koodiamme entistä enemmän luomalla abstraktin ympärille try/catch
logiikka. Voimme saavuttaa tämän luomalla uuden kansion projektihakemistoon nimeltä utils
, ja luo siihen tiedosto nimeltä tryCatch.js
.
Abstrahoidaksesi try-catch
logiikka – voimme määrittää funktion, joka hyväksyy toisen funktion (tunnetaan nimellä ohjain) parametrinaan ja palauttaa an async
toiminto, joka pitää sisällään a try/catch
mille tahansa vastaanotetulle ohjaimelle.
Jos ohjaimessa tapahtuu virhe, se jää kiinni catch
lohko ja seuraava funktio on nimeltään:
const tryCatch = (controller) => async (req, res, next) => {
try {
await controller(req, res);
} catch (error) {
return next(error);
}
};
module.exports = tryCatch;
Kanssa try/catch
abstraktio, voimme muuttaa koodimme ytimekkäämmäksi jättämällä väliin try-catch
lauseke nimenomaisesti haettaessa käyttäjiä 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);
})
);
Olemme onnistuneesti poistaneet try-catch-logiikan ja koodimme toimii edelleen kuten ennen.
Vahvistusvirheiden käsittely Expressissä
Tätä demoa varten luomme Express-sovelluksessamme uuden reitin kirjautumiseen – käyttäjätunnuksen vahvistamiseksi sisäänkirjautumisen yhteydessä. Ensin asennamme joi
paketti, joka auttaa luomaan skeeman, jonka avulla voimme valvoa vaatimuksia:
$ npm i joi
Luo seuraavaksi skeema, joka on a Joi.object
kanssa userId
jonka on oltava numero ja se on pakollinen – eli pyynnön on vastattava objektia, jossa on käyttäjätunnus.
Voimme käyttää validate()
menetelmä skeemaobjektissa jokaisen syötteen tarkistamiseksi skeemaa vastaan:
const schema = Joi.object({
userId: Joi.number().required(),
});
app.post(
"/login",
tryCatch(async (req, res) => {
const {error, value} = schema.validate({});
if (error) throw error;
})
);
Jos tyhjä objekti siirretään sisään validate()
-menetelmällä, virhe käsitellään sulavasti ja virheviesti lähetetään asiakkaalle:
Konsolissa saamme myös pääsyn a details
taulukko, joka sisältää erilaisia virheen yksityiskohtia, jotka voidaan tarvittaessa ilmoittaa käyttäjälle.
Jotta validointivirheet voidaan käsitellä erityisesti siten, että asianmukainen virhetieto välitetään validointivirhettä kohti, virheenkäsittelijän väliohjelmisto voidaan muuttaa uudelleen:
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;
Kanssa errorHandler.js
nyt räätälöitynä, kun teemme saman pyynnön tyhjällä objektilla, joka välitetään validate()
menetelmä:
Meillä on nyt pääsy räätälöityyn objektiin, joka palauttaa viestit luettavammalla/ystävällisemmällä tavalla. Näin pystymme lähettämään ja käsittelemään erilaisia virheitä sisääntulevan virhetyypin mukaan.
Yhteenveto
Tässä oppaassa kävimme läpi kaikki Express.js:n virheenkäsittelyn osa-alueet, mukaan lukien kuinka synkronista ja asynkronista koodia käsitellään oletusarvoisesti, miten voit luoda omia virheluokkia, kirjoittaa mukautettuja virheenkäsittelyn väliohjelmistotoimintoja ja tarjota next
viimeisenä saaliskäsittelijänä
Kuten jokaisessa tehtävässä, kehitysvaiheessa on myös parhaita käytäntöjä, joihin kuuluu tehokas virheiden käsittely, ja tänään olemme oppineet, kuinka voimme käsitellä Express-sovelluksen virheitä vankalla tavalla.
Virheiden asianmukainen käsittely ei tarkoita vain kehitysajan lyhentämistä bugien ja virheiden löytämisellä, vaan myös vankan koodikannan kehittämistä suuria sovelluksia varten. Tässä oppaassa olemme nähneet, kuinka väliohjelmisto asetetaan toimintavirheiden käsittelyä varten. Joitakin muita tapoja parantaa virheiden käsittelyä ovat: pinojälkien lähettämättä jättäminen, prosessien sulattaminen käsittelemättä havaitsemattomia poikkeuksia, asianmukaisten virheilmoitusten lähettäminen, virhelokien lähettäminen ja luokan määrittäminen, joka laajentaa Error
luokka.
Toivon, että tässä opetusohjelmassa käyttämäni esimerkit olivat sinulle miellyttäviä. Käsittelin erilaisia skenaarioita, joita saatat kohdata kirjoittaessasi Express-sovellusta käytettäväksi todellisessa maailmassa virheenhallinnasta. Ole hyvä ja kerro minulle, jos minulta jäi jotain paitsi. Se hyödyttää meitä ja auttaa minua myös oppimaan lisää. Hyvää päivää ja kiitos kun luit.
Voit viitata kaikkiin artikkelissa käytettyyn lähdekoodiin Github.