Lietuvių

Išnagrinėkite pažangius Express.js tarpinės programinės įrangos modelius, kad sukurtumėte tvirtas, mastelio keitimui pritaikytas ir prižiūrimas žiniatinklio programas, skirtas pasaulinei auditorijai. Sužinokite apie klaidų tvarkymą, autentifikavimą, užklausų ribojimą ir kt.

Express.js tarpinė programinė įranga: pažangių modelių įsisavinimas mastelio keitimui pritaikytoms programoms

Express.js – greita, neprimetanti nuomonės, minimalistinė Node.js žiniatinklio sistema – yra žiniatinklio programų ir API kūrimo pagrindas. Jos esmė – galinga tarpinės programinės įrangos koncepcija. Šis tinklaraščio įrašas gilinsis į pažangius tarpinės programinės įrangos modelius, suteikdamas jums žinių ir praktinių pavyzdžių, kaip kurti tvirtas, mastelio keitimui pritaikytas ir prižiūrimas programas, tinkamas pasaulinei auditorijai. Išnagrinėsime klaidų tvarkymo, autentifikavimo, autorizavimo, užklausų ribojimo ir kitus svarbius šiuolaikinių žiniatinklio programų kūrimo aspektus.

Tarpinės programinės įrangos supratimas: pagrindas

Tarpinės programinės įrangos funkcijos Express.js yra funkcijos, turinčios prieigą prie užklausos objekto (req), atsakymo objekto (res) ir kitos tarpinės programinės įrangos funkcijos programos užklausos-atsakymo cikle. Tarpinės programinės įrangos funkcijos gali atlikti įvairias užduotis, įskaitant:

Tarpinė programinė įranga iš esmės yra konvejeris. Kiekviena tarpinės programinės įrangos dalis atlieka savo specifinę funkciją, o tada, pasirinktinai, perduoda valdymą kitai tarpinei programinei įrangai grandinėje. Šis modulinis požiūris skatina kodo pakartotinį panaudojimą, atsakomybių atskyrimą ir švaresnę programos architektūrą.

Tarpinės programinės įrangos anatomija

Tipinė tarpinės programinės įrangos funkcija turi tokią struktūrą:

function myMiddleware(req, res, next) {
  // Atlikti veiksmus
  // Pavyzdys: registruoti užklausos informaciją
  console.log(`Užklausa: ${req.method} ${req.url}`);

  // Iškviesti kitą tarpinę programinę įrangą
  next();
}

Funkcija next() yra labai svarbi. Ji signalizuoja Express.js, kad dabartinė tarpinė programinė įranga baigė savo darbą ir valdymas turėtų būti perduotas kitai tarpinės programinės įrangos funkcijai. Jei next() funkcija neiškviečiama, užklausa bus sustabdyta, o atsakymas niekada nebus išsiųstas.

Tarpinės programinės įrangos tipai

Express.js siūlo kelis tarpinės programinės įrangos tipus, kurių kiekvienas skirtas skirtingam tikslui:

Pažangūs tarpinės programinės įrangos modeliai

Panagrinėkime keletą pažangių modelių, kurie gali žymiai pagerinti jūsų Express.js programos funkcionalumą, saugumą ir prižiūrimumą.

1. Klaidų tvarkymo tarpinė programinė įranga

Efektyvus klaidų tvarkymas yra būtinas kuriant patikimas programas. Express.js siūlo specialią klaidų tvarkymo tarpinės programinės įrangos funkciją, kuri dedama *paskutinė* tarpinės programinės įrangos eilėje. Ši funkcija priima keturis argumentus: (err, req, res, next).

Štai pavyzdys:

// Klaidų tvarkymo tarpinė programinė įranga
app.use((err, req, res, next) => {
  console.error(err.stack); // Registruoti klaidą derinimo tikslais
  res.status(500).send('Kažkas sugedo!'); // Atsakyti su atitinkamu būsenos kodu
});

Svarbiausi klaidų tvarkymo aspektai:

2. Autentifikavimo ir autorizavimo tarpinė programinė įranga

Saugoti savo API ir apsaugoti jautrius duomenis yra labai svarbu. Autentifikavimas patvirtina vartotojo tapatybę, o autorizavimas nustato, ką vartotojui leidžiama daryti.

Autentifikavimo strategijos:

Autorizavimo strategijos:

Pavyzdys (JWT autentifikavimas):

const jwt = require('jsonwebtoken');
const secretKey = 'JŪSŲ_SLAPTAS_RAKTAS'; // Pakeiskite stipriu, aplinkos kintamuoju pagrįstu raktu

// Tarpinė programinė įranga JWT ženklams patikrinti
function authenticateToken(req, res, next) {
  const authHeader = req.headers['authorization'];
  const token = authHeader && authHeader.split(' ')[1];

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

  jwt.verify(token, secretKey, (err, user) => {
    if (err) return res.sendStatus(403); // Uždrausta
    req.user = user; // Pridėti vartotojo duomenis prie užklausos
    next();
  });
}

// Pavyzdinis maršrutas, apsaugotas autentifikavimu
app.get('/profile', authenticateToken, (req, res) => {
  res.json({ message: `Sveiki, ${req.user.username}` });
});

Svarbūs saugumo aspektai:

3. Užklausų ribojimo tarpinė programinė įranga

Užklausų ribojimas apsaugo jūsų API nuo piktnaudžiavimo, pavyzdžiui, paslaugos trikdymo (DoS) atakų ir pernelyg didelio išteklių naudojimo. Jis apriboja užklausų, kurias klientas gali pateikti per tam tikrą laiko tarpą, skaičių.

Užklausų ribojimui dažnai naudojamos bibliotekos, tokios kaip express-rate-limit. Taip pat apsvarstykite paketą helmet, kuris apima pagrindinę užklausų ribojimo funkciją bei daugybę kitų saugumo patobulinimų.

Pavyzdys (naudojant express-rate-limit):

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

const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 minučių
  max: 100, // Apriboti kiekvieną IP iki 100 užklausų per windowMs
  message: 'Per daug užklausų iš šio IP adreso, bandykite dar kartą po 15 minučių',
});

// Pritaikyti užklausų ribojimą konkretiems maršrutams
app.use('/api/', limiter);

// Arba pritaikyti visiems maršrutams (paprastai mažiau pageidautina, nebent visas srautas turėtų būti traktuojamas vienodai)
// app.use(limiter);

Užklausų ribojimo pritaikymo parinktys apima:

4. Užklausos turinio analizavimo tarpinė programinė įranga

Express.js pagal nutylėjimą neanalizuoja užklausos turinio. Jums reikės naudoti tarpinę programinę įrangą, kad apdorotumėte skirtingus turinio formatus, tokius kaip JSON ir URL koduoti duomenys. Nors senesnėse implementacijose galėjo būti naudojami paketai, tokie kaip `body-parser`, dabartinė geriausia praktika yra naudoti Express integruotą tarpinę programinę įrangą, prieinamą nuo Express v4.16.

Pavyzdys (naudojant integruotą tarpinę programinę įrangą):

app.use(express.json()); // Analizuoja JSON koduotus užklausų turinius
app.use(express.urlencoded({ extended: true })); // Analizuoja URL koduotus užklausų turinius

express.json() tarpinė programinė įranga analizuoja gaunamas užklausas su JSON turiniu ir padaro išanalizuotus duomenis prieinamus req.body. express.urlencoded() tarpinė programinė įranga analizuoja gaunamas užklausas su URL koduotu turiniu. Parinktis { extended: true } leidžia analizuoti sudėtingus objektus ir masyvus.

5. Registravimo tarpinė programinė įranga

Efektyvus registravimas yra būtinas derinant, stebint ir audituojant jūsų programą. Tarpinė programinė įranga gali perimti užklausas ir atsakymus, kad registruotų atitinkamą informaciją.

Pavyzdys (paprasta registravimo tarpinė programinė įranga):

const morgan = require('morgan'); // Populiarus HTTP užklausų registratorius

app.use(morgan('dev')); // Registruoti užklausas 'dev' formatu

// Kitas pavyzdys, pasirinktinis formatavimas
app.use((req, res, next) => {
  console.log(`${req.method} ${req.url} - ${new Date().toISOString()}`);
  next();
});

Gamybinėms aplinkoms apsvarstykite galimybę naudoti patikimesnę registravimo biblioteką (pvz., Winston, Bunyan) su šiomis funkcijomis:

6. Užklausų tikrinimo tarpinė programinė įranga

Tikrinkite gaunamas užklausas, kad užtikrintumėte duomenų vientisumą ir išvengtumėte netikėto elgesio. Tai gali apimti užklausos antraščių, užklausos parametrų ir užklausos turinio duomenų tikrinimą.

Bibliotekos užklausų tikrinimui:

Pavyzdys (naudojant 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 }); // Nustatykite abortEarly į false, kad gautumėte visas klaidas

  if (error) {
    return res.status(400).json({ errors: error.details.map(err => err.message) }); // Grąžinti išsamius klaidų pranešimus
  }

  next();
}

app.post('/users', validateUser, (req, res) => {
  // Vartotojo duomenys yra teisingi, tęsti su vartotojo kūrimu
  res.status(201).json({ message: 'Vartotojas sėkmingai sukurtas' });
});

Geriausios praktikos užklausų tikrinimui:

7. Atsakymo suspaudimo tarpinė programinė įranga

Pagerinkite savo programos našumą suspausdami atsakymus prieš siunčiant juos klientui. Tai sumažina perduodamų duomenų kiekį, todėl įkėlimo laikas sutrumpėja.

Pavyzdys (naudojant suspaudimo tarpinę programinę įrangą):

const compression = require('compression');

app.use(compression()); // Įjungti atsakymų suspaudimą (pvz., gzip)

compression tarpinė programinė įranga automatiškai suspaudžia atsakymus naudojant gzip arba deflate, atsižvelgiant į kliento Accept-Encoding antraštę. Tai ypač naudinga teikiant statinius išteklius ir didelius JSON atsakymus.

8. CORS (skirtingų šaltinių išteklių dalijimosi) tarpinė programinė įranga

Jei jūsų API ar žiniatinklio programa turi priimti užklausas iš skirtingų domenų (šaltinių), jums reikės konfigūruoti CORS. Tai apima atitinkamų HTTP antraščių nustatymą, kad būtų leidžiamos skirtingų šaltinių užklausos.

Pavyzdys (naudojant CORS tarpinę programinę įrangą):

const cors = require('cors');

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

app.use(cors(corsOptions));

// ARBA leisti visus šaltinius (kūrimo ar vidinėms API - naudoti atsargiai!)
// app.use(cors());

Svarbūs CORS aspektai:

9. Statinių failų pateikimas

Express.js siūlo integruotą tarpinę programinę įrangą statiniams failams (pvz., HTML, CSS, JavaScript, paveikslėliams) pateikti. Tai paprastai naudojama programos priekinės dalies (front-end) pateikimui.

Pavyzdys (naudojant express.static):

app.use(express.static('public')); // Pateikti failus iš 'public' katalogo

Dėkite savo statinius išteklius į public katalogą (ar bet kurį kitą nurodytą katalogą). Tada Express.js automatiškai pateiks šiuos failus pagal jų failų kelius.

10. Pasirinktinė tarpinė programinė įranga specifinėms užduotims

Be aptartų modelių, galite kurti pasirinktinę tarpinę programinę įrangą, pritaikytą specifiniams jūsų programos poreikiams. Tai leidžia jums apgaubti sudėtingą logiką ir skatinti kodo pakartotinį panaudojimą.

Pavyzdys (pasirinktinė tarpinė programinė įranga funkcijų vėliavoms):

// Pasirinktinė tarpinė programinė įranga, skirta įjungti/išjungti funkcijas pagal konfigūracijos failą
const featureFlags = require('./config/feature-flags.json');

function featureFlagMiddleware(featureName) {
  return (req, res, next) => {
    if (featureFlags[featureName] === true) {
      next(); // Funkcija įjungta, tęsti
    } else {
      res.status(404).send('Funkcija nepasiekiama'); // Funkcija išjungta
    }
  };
}

// Naudojimo pavyzdys
app.get('/new-feature', featureFlagMiddleware('newFeatureEnabled'), (req, res) => {
  res.send('Tai yra nauja funkcija!');
});

Šis pavyzdys demonstruoja, kaip naudoti pasirinktinę tarpinę programinę įrangą, norint kontroliuoti prieigą prie konkrečių maršrutų, remiantis funkcijų vėliavomis. Tai leidžia kūrėjams kontroliuoti funkcijų išleidimą nekeičiant ir nediegiant kodo, kuris dar nėra visiškai patikrintas – tai įprasta praktika programinės įrangos kūrime.

Geriausios praktikos ir aspektai pasaulinėms programoms

Išvada

Pažangių tarpinės programinės įrangos modelių įsisavinimas yra labai svarbus kuriant tvirtas, saugias ir mastelio keitimui pritaikytas Express.js programas. Efektyviai naudodami šiuos modelius, galite kurti programas, kurios yra ne tik funkcionalios, bet ir prižiūrimos bei tinkamos pasaulinei auditorijai. Nepamirškite teikti pirmenybės saugumui, našumui ir prižiūrimumui visame kūrimo procese. Kruopščiai planuodami ir įgyvendindami, galite išnaudoti Express.js tarpinės programinės įrangos galią kurdami sėkmingas žiniatinklio programas, atitinkančias vartotojų poreikius visame pasaulyje.

Papildoma literatūra: