Eesti

Avastage Express.js-i täiustatud vahevara mustreid, et luua tugevaid, skaleeruvaid ja hooldatavaid veebirakendusi globaalsele publikule. Õppige veahaldust, autentimist, päringute piiramist ja muud.

Express.js-i vahevara: Täiustatud mustrite valdamine skaleeruvate rakenduste jaoks

Express.js, kiire, arvamusvaba ja minimalistlik veebiraamistik Node.js-i jaoks, on veebirakenduste ja API-de loomise nurgakivi. Selle keskmes peitub võimas vahevara kontseptsioon. See blogipostitus süveneb täiustatud vahevara mustritesse, pakkudes teile teadmisi ja praktilisi näiteid tugevate, skaleeruvate ja hooldatavate rakenduste loomiseks, mis sobivad globaalsele publikule. Uurime tehnikaid veahalduseks, autentimiseks, autoriseerimiseks, päringute piiramiseks ja muudeks kaasaegsete veebirakenduste ehitamise kriitilisteks aspektideks.

Vahevara mõistmine: Alused

Express.js-i vahevara funktsioonid on funktsioonid, millel on juurdepääs päringuobjektile (req), vastuseobjektile (res) ja järgmisele vahevara funktsioonile rakenduse päringu-vastuse tsüklis. Vahevara funktsioonid võivad täita mitmesuguseid ülesandeid, sealhulgas:

Vahevara on sisuliselt torujuhe. Iga vahevara osa täidab oma spetsiifilist funktsiooni ja seejärel, valikuliselt, annab kontrolli edasi järgmisele vahevarale ahelas. See modulaarne lähenemine soodustab koodi taaskasutamist, ülesannete eraldamist ja puhtamat rakenduse arhitektuuri.

Vahevara anatoomia

Tüüpiline vahevara funktsioon järgib seda struktuuri:

function myMiddleware(req, res, next) {
  // Teosta toiminguid
  // Näide: logi päringu teave
  console.log(`Päring: ${req.method} ${req.url}`);

  // Kutsu välja järgmine vahevara pinus
  next();
}

Funktsioon next() on ülioluline. See annab Express.js-ile märku, et praegune vahevara on oma töö lõpetanud ja kontroll tuleks anda edasi järgmisele vahevara funktsioonile. Kui funktsiooni next() ei kutsuta, jääb päring seisma ja vastust ei saadeta kunagi.

Vahevara tüübid

Express.js pakub mitut tüüpi vahevara, millest igaüks teenib erinevat eesmärki:

Täiustatud vahevara mustrid

Uurime mõningaid täiustatud mustreid, mis võivad oluliselt parandada teie Express.js-i rakenduse funktsionaalsust, turvalisust ja hooldatavust.

1. Veahalduse vahevara

Tõhus veahaldus on usaldusväärsete rakenduste loomisel esmatähtis. Express.js pakub spetsiaalset veahalduse vahevara funktsiooni, mis paigutatakse vahevara pinus *viimaseks*. See funktsioon võtab neli argumenti: (err, req, res, next).

Siin on näide:

// Veahalduse vahevara
app.use((err, req, res, next) => {
  console.error(err.stack); // Logi viga silumiseks
  res.status(500).send('Midagi läks katki!'); // Vasta sobiva olekukoodiga
});

Põhikaalutlused veahaldusel:

2. Autentimise ja autoriseerimise vahevara

Teie API kindlustamine ja tundlike andmete kaitsmine on ülioluline. Autentimine kontrollib kasutaja identiteeti, samas kui autoriseerimine määrab, mida kasutajal on lubatud teha.

Autentimisstrateegiad:

Autoriseerimisstrateegiad:

Näide (JWT autentimine):

const jwt = require('jsonwebtoken');
const secretKey = 'SINU_SALAVÕTI'; // Asenda tugeva, keskkonnamuutujal põhineva võtmega

// Vahevara JWT tokenite verifitseerimiseks
function authenticateToken(req, res, next) {
  const authHeader = req.headers['authorization'];
  const token = authHeader && authHeader.split(' ')[1];

  if (token == null) return res.sendStatus(401); // Autoriseerimata

  jwt.verify(token, secretKey, (err, user) => {
    if (err) return res.sendStatus(403); // Keelatud
    req.user = user; // Lisa kasutaja andmed päringule
    next();
  });
}

// Näidismarsruut, mis on kaitstud autentimisega
app.get('/profile', authenticateToken, (req, res) => {
  res.json({ message: `Tere tulemast, ${req.user.username}` });
});

Olulised turvakaalutlused:

3. Päringute piiramise vahevara

Päringute piiramine kaitseb teie API-d kuritarvitamise, näiteks teenusetõkestamise (DoS) rünnakute ja liigse ressursitarbimise eest. See piirab päringute arvu, mida klient saab teatud ajavahemiku jooksul teha.

Päringute piiramiseks kasutatakse tavaliselt teeke nagu express-rate-limit. Kaaluge ka paketti helmet, mis sisaldab lisaks mitmetele muudele turvatäiustustele ka põhilist päringute piiramise funktsionaalsust.

Näide (kasutades express-rate-limit):

const rateLimit = require('express-rate-limit');

const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 minutit
  max: 100, // Piira iga IP-aadress 100 päringuga windowMs aja jooksul
  message: 'Liiga palju päringuid sellelt IP-lt, proovige uuesti 15 minuti pärast',
});

// Rakenda päringute piiraja spetsiifilistele marsruutidele
app.use('/api/', limiter);

// Alternatiivselt rakenda kõikidele marsruutidele (üldiselt vähem soovitav, kui kogu liiklust ei peaks kohtlema võrdselt)
// app.use(limiter);

Päringute piiramise kohandamisvalikud hõlmavad:

4. Päringu keha parsimise vahevara

Express.js ei parsi vaikimisi päringu keha. Peate kasutama vahevara erinevate keha vormingute, näiteks JSON ja URL-kodeeritud andmete käsitlemiseks. Kuigi vanemates implementatsioonides võidi kasutada pakette nagu `body-parser`, on praegune parim praktika kasutada Expressi sisseehitatud vahevara, mis on saadaval alates Express v4.16-st.

Näide (kasutades sisseehitatud vahevara):

app.use(express.json()); // Parsib JSON-kodeeritud päringu kehasid
app.use(express.urlencoded({ extended: true })); // Parsib URL-kodeeritud päringu kehasid

`express.json()` vahevara parsib sissetulevad JSON-koormaga päringud ja teeb paritud andmed kättesaadavaks `req.body` all. `express.urlencoded()` vahevara parsib sissetulevad URL-kodeeritud koormaga päringud. Valik `{ extended: true }` võimaldab parsida rikkalikke objekte ja massiive.

5. Logimise vahevara

Tõhus logimine on hädavajalik rakenduse silumiseks, jälgimiseks ja auditeerimiseks. Vahevara saab päringuid ja vastuseid kinni püüda, et logida asjakohast teavet.

Näide (Lihtne logimise vahevara):

const morgan = require('morgan'); // Populaarne HTTP päringute logija

app.use(morgan('dev')); // Logi päringuid 'dev' formaadis

// Teine näide, kohandatud vormindus
app.use((req, res, next) => {
  console.log(`${req.method} ${req.url} - ${new Date().toISOString()}`);
  next();
});

Tootmiskeskkondade jaoks kaaluge robustsema logimisteegi (nt Winston, Bunyan) kasutamist koos järgmisega:

6. Päringu valideerimise vahevara

Valideerige sissetulevaid päringuid, et tagada andmete terviklikkus ja vältida ootamatut käitumist. See võib hõlmata päringu päiste, päringu parameetrite ja päringu keha andmete valideerimist.

Teegid päringu valideerimiseks:

Näide (kasutades Joi):

const Joi = require('joi');

const userSchema = Joi.object({
  username: Joi.string().min(3).max(30).required(),
  email: Joi.string().email().required(),
  password: Joi.string().min(6).required(),
});

function validateUser(req, res, next) {
  const { error } = userSchema.validate(req.body, { abortEarly: false }); // Määra abortEarly väärtuseks false, et saada kõik vead

  if (error) {
    return res.status(400).json({ errors: error.details.map(err => err.message) }); // Tagasta detailsed veateated
  }

  next();
}

app.post('/users', validateUser, (req, res) => {
  // Kasutaja andmed on kehtivad, jätka kasutaja loomisega
  res.status(201).json({ message: 'Kasutaja edukalt loodud' });
});

Parimad praktikad päringu valideerimisel:

7. Vastuse tihendamise vahevara

Parandage oma rakenduse jõudlust, tihendades vastuseid enne nende kliendile saatmist. See vähendab edastatavate andmete hulka, mille tulemuseks on kiiremad laadimisajad.

Näide (kasutades tihendamise vahevara):

const compression = require('compression');

app.use(compression()); // Luba vastuse tihendamine (nt gzip)

compression vahevara tihendab vastused automaatselt, kasutades gzip-i või deflate'i, tuginedes kliendi Accept-Encoding päisele. See on eriti kasulik staatiliste varade ja suurte JSON-vastuste serveerimisel.

8. CORS-i (Cross-Origin Resource Sharing) vahevara

Kui teie API või veebirakendus peab vastu võtma päringuid erinevatest domeenidest (päritoludest), peate konfigureerima CORS-i. See hõlmab sobivate HTTP päiste seadistamist, et lubada ristpäritoluga päringuid.

Näide (kasutades CORS-i vahevara):

const cors = require('cors');

const corsOptions = {
  origin: 'https://sinu-lubatud-domeen.com',
  methods: 'GET,POST,PUT,DELETE',
  allowedHeaders: 'Content-Type,Authorization'
};

app.use(cors(corsOptions));

// VÕI luba kõik päritolud (arenduseks või sisemistele API-dele -- kasuta ettevaatlikult!)
// app.use(cors());

Olulised kaalutlused CORS-i puhul:

9. Staatiliste failide serveerimine

Express.js pakub sisseehitatud vahevara staatiliste failide (nt HTML, CSS, JavaScript, pildid) serveerimiseks. Seda kasutatakse tavaliselt rakenduse esiosa serveerimiseks.

Näide (kasutades express.static):

app.use(express.static('public')); // Serveeri faile 'public' kaustast

Asetage oma staatilised varad public kausta (või mis tahes muusse kausta, mille määrate). Express.js serveerib seejärel need failid automaatselt nende failiteede alusel.

10. Kohandatud vahevara spetsiifilisteks ülesanneteks

Lisaks arutatud mustritele saate luua kohandatud vahevara, mis on kohandatud teie rakenduse spetsiifilistele vajadustele. See võimaldab teil kapseldada keerukat loogikat ja edendada koodi taaskasutatavust.

Näide (Kohandatud vahevara funktsioonilippude jaoks):

// Kohandatud vahevara funktsioonide lubamiseks/keelamiseks konfiguratsioonifaili põhjal
const featureFlags = require('./config/feature-flags.json');

function featureFlagMiddleware(featureName) {
  return (req, res, next) => {
    if (featureFlags[featureName] === true) {
      next(); // Funktsioon on lubatud, jätka
    } else {
      res.status(404).send('Funktsioon pole saadaval'); // Funktsioon on keelatud
    }
  };
}

// Kasutusnäide
app.get('/new-feature', featureFlagMiddleware('newFeatureEnabled'), (req, res) => {
  res.send('See on uus funktsioon!');
});

See näide demonstreerib, kuidas kasutada kohandatud vahevara, et kontrollida juurdepääsu spetsiifilistele marsruutidele funktsioonilippude alusel. See võimaldab arendajatel kontrollida funktsioonide väljalaskeid ilma koodi uuesti juurutamata või muutmata, mis pole täielikult kontrollitud, mis on tarkvaraarenduses levinud praktika.

Parimad praktikad ja kaalutlused globaalsete rakenduste jaoks

Kokkuvõte

Täiustatud vahevara mustrite valdamine on ülioluline tugevate, turvaliste ja skaleeruvate Express.js-i rakenduste loomisel. Neid mustreid tõhusalt kasutades saate luua rakendusi, mis pole mitte ainult funktsionaalsed, vaid ka hooldatavad ja sobivad hästi globaalsele publikule. Ärge unustage kogu oma arendusprotsessi vältel seada esikohale turvalisust, jõudlust ja hooldatavust. Hoolika planeerimise ja rakendamisega saate kasutada Express.js-i vahevara jõudu, et luua edukaid veebirakendusi, mis vastavad kasutajate vajadustele kogu maailmas.

Lisalugemist:

Express.js-i vahevara: Täiustatud mustrite valdamine skaleeruvate rakenduste jaoks | MLOG