Hogyan írjunk köztes szoftvert
Elgondolkodtál már azon, hogy mi folyik az összes Express.js köztes programban, amelyet hozzáad a webalkalmazásához? Valójában lenyűgöző, hogy milyen funkciókat adhat hozzá az alkalmazásaihoz csak egy vagy néhány kódsorral:

A fenti utolsó három sor eléggé kezeli számunkra a webapp funkciókat. Az első app.use () hívás megmondja az Express-nek, hogy hol vannak a statikus fájljaink, és hogyan tegye őket ki, a cookieParser ('titkos') köztes szoftver kezeli az összes cookie-elemzést (titkosítással), az utolsó pedig a gzip automatikusan tömöríti az összes HTTP-t testadatok. Nem rossz csak három kódsorból.
Ezek a köztes programok meglehetősen tipikusak az átlagos webalkalmazásban, de találhat olyanokat, amelyek nem csupán a szokásos adattömörítést vagy a cookie-elemzést teszik lehetővé. Vegyük például ezeket:
- sisak: Különböző HTTP fejlécek beállításával segíti az alkalmazás biztonságát
- express-simple-cdn: Könnyen használhat CDN-t statikus eszközeihez
- join-io: Csatlakoztassa a fájlokat menet közben, hogy csökkentse a HTTP kérések számát
- útlevél: Felhasználói hitelesítést ad a kiválasztott útvonalakhoz
És itt van egy sokkal nagyobb köztes lista, amelyet érdemes használni.
Most, hogy látott néhány példát, itt mindent elmondhat, amit tehet vele:
- Végezzen el bármilyen kódot, beleértve az aszinkron kódot is
- Végezzen módosításokat vagy kiegészítéseket a kérés és válasz objektumokban
- Fejezze be a kérés-válasz ciklust
- Hívja meg a verem következő köztes szoftverét
A végtelen lehetőségek mellett biztos vagyok benne, hogy van néhány saját ötlete, amelyet szeretne létrehozni, ezért a cikk további részében bemutatom, hogyan kell megírni a saját köztes szoftvert. Néhány különböző típusú köztes szoftver írható (alkalmazás, útválasztó, hibakezelés stb.), De ebben a cikkben csak az alkalmazásszintre fogunk koncentrálni.
Az alapok
A köztes szoftverekről szinte úgy gondolhatunk, mintha Express útvonalról lenne szó. Ugyanazokat a paramétereket és mindent vesznek, de a szokásos útvonaltól eltérően nem kötelező megadni az URL elérési utat a köztes programhoz. A két legnagyobb különbség az, hogyan kezelik az utat és mikor hívják.
A megadott elérési utat előtagként kezeljük, tehát ha valami hasonló volt, mint az app.use ('/ api',.), akkor a köztes programunk futni fog, ha az/api meghívást kapjuk, és ha az/api/felhasználókat hívjuk meg. Ez különbözik azoktól az útvonalaktól, ahol az útvonalnak pontosan egyezni kell.
Az URL elérési útja elhagyható az app.use () hívásból, ha azt akarja, hogy a kód minden kéréshez fusson, különben megadhat egy elérési utat, és a kódot csak akkor futtathatja, ha az adott útvonal (és annak összes útvonala) kérte. Ez például hasznos lehet hitelesítés hozzáadásához csak néhány megadott útvonalhoz.
Egy egyszerű köztes szoftver így nézhet ki:
Mivel az útvonalkezelő így néz ki:
Lát? Alapvetően ugyanazok, tehát ezeknek a funkcióknak az írása elég ismerősnek érezheti magát.
Az alkalmazott paraméterek a következők:
- req: Az összes vonatkozó kérési információt tartalmazó objektum. Ez bármi lehet, a kért URL-től a POST-kérelem törzséig és a felhasználó IP-címéig.
- res: Ez az a válaszobjektum, amellyel adatokat küldünk a felhasználónak az adott kéréshez. Használhatja ezt egy HTTP 404 válaszkód visszaküldéséhez vagy a renderelt HTML visszaküldéséhez a res.render () segítségével .
- következő: És végül a következő paraméter egy visszahívás, amely közli az Express-szel, amikor a köztes szoftverünk befejeződött. Ha bármilyen IO-t (például adatbázis-hívást) vagy nagy számítást végez, akkor valószínűleg a funkciót aszinkronvá kell tenni, hogy megakadályozza a fő végrehajtási szál blokkolását. Ebben az esetben a következőt kell használnia .
Érdemes megjegyezni, hogy ha a köztes szoftver nem fejezi be a kérés-válasz ciklust a res.end (.) Paranccsal, akkor Ön kell hívja a következőt (), hogy átadja a vezérlést a következő köztes programnak. Ha nem, akkor a kérés függőben marad, és időtúllépés történik.
Egy példa
Ebben a példában létrehozunk egy köztes szoftvert, amely segít a szöveg automatikus lefordításában a nyelvek között. Ez azonban nem egy tipikus i18n modul, hanem a Google Fordítót fogjuk használni.
Tegyük fel, hogy készített egy csevegőalkalmazást, amely lehetővé teszi, hogy a világ minden tájáról beszéljen emberekkel, és zökkenőmentessé tétele érdekében a szöveget automatikusan lefordítja. Ebben a használati esetben a legtöbb i18n modul nem fog működni, mivel az összes karakterláncot előre le kell fordítania, amit nem tehetünk meg, mivel felhasználói bevitellel foglalkozunk.
Persze, kezelheti a fordítást minden Express útvonalán, vagy megadhatja az Ön számára a köztes programban, amely tisztábban tartja az útvonal kódját, és megakadályozza, hogy elfelejtse hozzá fordítást minden útvonalhoz, amelyre szüksége van.
A karaktersorozatok (felhasználói üzenetek) egy REST API-n keresztül érkeznek, ezért meg kell vizsgálnunk az API-útvonalak összes törzsét, hogy legyen-e szöveg lefordítva. A POST-hívások során az adatbázisba mentett összes karakterláncot az anyanyelvükön fogják megtartani, de az adatbázisból a GET-hívásokkal lekért összes karakterláncot lefordítják a felhasználói kérést kísérő HTTP Accept-Language fejlécben megadott nyelvre.
Arra gondoltam, hogy nem fogjuk az adatbázis összes üzenetét ugyanazon a nyelven elkészíteni, mivel akkor néhányat kétszer kell lefordítanunk, ami rontja a fordítás minőségét.
Először írjunk egy egyszerű függvényt a Google Fordító API meghívására:
Ezután ezt a függvényt fogjuk használni a köztes szoftver kódunkban, amelyet a modul.export fájlban exportálunk az alkalmazás számára.
JEGYZET: Nem igazán módosítod a Válasz törzset. Csak a rövidség kedvéért egyszerűsítem. Ha meg szeretné tudni, hogyan módosíthatja a törzset, akkor nézze meg a tömörítő köztes szoftvert, amely megfelelően csinálja. Meg kell proxyolnia a res.write és res.end függvényeket, amit én nem tettem meg, mert csak elvonja a figyelmemet azokról a fogalmakról, amelyeket itt megpróbálok bemutatni.
És végül alkalmazzuk a köztes szoftvert az alkalmazásunkra. Csak győződjön meg róla, hogy az útvonalválasztás megadása után hívja meg az app.use függvényt. A hívás sorrendje az egyes funkciók futtatásának sorrendje.
Ne felejtse el felhívni a következőt () az/api útvonalakon, különben a köztes szoftver nem fog futni.
És ennyi van benne. A Response törzsben visszaküldött bármely karakterláncot, amely eltér a felhasználó által elfogadott nyelvtől, a Google Fordító lefordítja, amely érzékeli, hogy a forrásszöveg melyik nyelven található.
Tehát ha a válaszunk így nézett ki.
. és a felhasználó csak szuahéli nyelvet fogad el, majd a köztes programok futtatása után kapunk egy végső fordítást, amely így néz ki:
Következtetés
Bár félelmetesnek tűnhet, a köztes szoftvereket az Express-ben nagyon könnyű létrehozni. Bármihez használható, nem számít, milyen egyszerű vagy összetett.
Csak győződjön meg arról, hogy gyorsan keres az npm-en bármit, amit próbál, mivel rengeteg kód már ott van. Biztos vagyok benne, hogy van már csomag, amely megteszi azt, amit a fordítási kódom (és valószínűleg sokkal jobb is).
Van ötlete a köztes szoftverek létrehozására, vagy hogyan lehetne javítani a fenti példán? Tudassa velünk a megjegyzéseket!