Hogyan lehet egyszerűvé és tisztává tenni a bemenet ellenőrzését az Express.js alkalmazásban

Ez az oktatóanyag előzetes ismereteket igényel az expressjs keretrendszer használatáról

Miért van szükség szerveroldali ellenőrzésre?

  • Az ügyféloldali érvényesítés nem elegendő, és felborulhat
  • Inkább hajlamos az emberre a középső támadásokban, és a kiszolgálónak soha nem szabad megbíznia az ügyfél oldalon
  • A felhasználó kikapcsolhatja az ügyféloldali JavaScript-ellenőrzést és manipulálhatja az adatokat

Ha webalkalmazásokat épített Express keretrendszer vagy bármely más Node.js keretrendszer használatával, akkor az érvényesítés döntő szerepet játszik minden olyan webalkalmazásban, amely megköveteli a kérés érvényesítését bodyparamquery.

Saját middleware funkciójának megírása nehézkes lehet, ha

  • gyorsan akar mozogni, miközben megőrzi a kód minőségét, vagy
  • el akarja kerülni a fő vezérlő funkció használatát, vagy az üzleti logika meghatározásátif (req.body.head)if (req.params.isCool)

Ebben az oktatóanyagban megtudhatja, hogyan lehet érvényesíteni az Express.js alkalmazásban a bevitelt egy nyílt forráskódú és az express-validator nevű népszerű modullal.

Az express-validator bemutatása

A Github definíciója szerint:

Az express-validator egy express.js köztes eszközkészlet, amely beburkolja az validator.js érvényesítő és a fertőtlenítő funkciókat.

A modul öt fontos API-t valósít meg:

  • Ellenőrizze az API-t
  • Szűrő API
  • Sanitization chain API
  • Validációs lánc API
  • Validation Result API

Nézzünk meg egy alapfelhasználót routevalidációs modul nélkül egy felhasználó létrehozásához:/route/user.js

/** * @api {post} /api/user Create user * @apiName Create new user * @apiPermission admin * @apiGroup User * * @apiParam {String} [userName] username * @apiParam {String} [email] Email * @apiParam {String} [phone] Phone number * @apiParam {String} [status] Status * * @apiSuccess (200) {Object} mixed `User` object */ router.post('/', userController.createUser)

Most a felhasználói vezérlőben van /controllers/user.js

const User = require('./models/user') exports.createUser = (req, res, next) => { /** Here you need to validate user input. Let's say only Name and email are required field */ const { userName, email, phone, status } = req.body if (userName && email && isValidEmail(email)) { // isValidEmail is some custom email function to validate email which you might need write on your own or use npm module User.create({ userName, email, phone, status, }) .then(user => res.json(user)) .catch(next) } }

A fenti kód csak egy alapvető példa a mezők saját ellenőrzésére.

A Mongoose használatával kezelhet néhány érvényesítést a felhasználói modellben. A bevált gyakorlatok érdekében szeretnénk megbizonyosodni arról, hogy az érvényesítés az üzleti logika előtt történik-e.

az express-validator gondoskodik ezekről az ellenőrzésekről és a bemenetek fertőtlenítéséről is.

Telepítés

npm install --save express-validator

Foglalja be a modult a fő server.jsfájljába:

const express = require('express') const bodyParser = require('body-parser') const expressValidator = require('express-validator') const app = express() const router = express.Router() app.use(bodyParser.json()) app.use(expressValidator()) app.use('/api', router)

Most az express-validator használatával a következő /routes/user.jslesz:

router.post( '/', userController.validate('createUser'), userController.createUser, )

Itt userController.validatevan egy köztes szoftver funkció, amelyet az alábbiakban ismertetünk. Elfogadja azt a methodnevet, amelyre az érvényesítést használni fogják.

Hozzunk létre egy middleware funkciója validate()a mi /controllers/user.js:

const { body } = require('express-validator/check') exports.validate = (method) => { switch (method) { case 'createUser': { return [ body('userName', 'userName doesn't exists').exists(), body('email', 'Invalid email').exists().isEmail(), body('phone').optional().isInt(), body('status').optional().isIn(['enabled', 'disabled']) ] } } }

Kérjük, olvassa el ezt a cikket, ha többet szeretne megtudni a funkció meghatározásáról és használatáról.

A bodyfüggvény csak érvényesíteni fog, req.bodyés két argumentumot vesz fel. Az első a property name. A második az Ön szokása message, amely akkor jelenik meg, ha az érvényesítés sikertelen. Ha nem ad meg egyéni üzenetet, akkor az alapértelmezett üzenet kerül felhasználásra.

Mint láthatja, egy requiredmező esetében a .exists()módszert használjuk. Mi használ .optional()egy optionalmezőt. Hasonlóképpen isEmail()isInt()érvényesítik emailés integer.

Ha azt szeretné, hogy egy beviteli mező csak bizonyos értékeket tartalmazzon, akkor használhatja .isIn([]). Ehhez egy arrayértékre van szükség, és ha a fentiektől eltérő értékeket kap, akkor hiba lép fel.

Például a fenti kódrészlet állapotmezőjének csak értéke enabledvagy disabledértéke lehet. Ha ettől eltérő értéket ad meg, hiba lép fel.

A /controllers/user.jsÍrjunk egy createUserfunkció, ahol meg lehet írni az üzleti logika. Utána hívjákvalidate()az érvényesítések eredményével.

const { validationResult } = require('express-validator/check'); exports.createUser = async (req, res, next) => { try { const errors = validationResult(req); // Finds the validation errors in this request and wraps them in an object with handy functions if (!errors.isEmpty()) { res.status(422).json({ errors: errors.array() }); return; } const { userName, email, phone, status } = req.body const user = await User.create({ userName, email, phone, status, }) res.json(user) } catch(err) { return next(err) } }

Ha kíváncsi, mi az az validationResult (req)?

Ez a függvény megtalálja az érvényesítési hibákat ebben a kérésben, és egy hasznos funkcióval rendelkező objektumba burkolja őket

Most, amikor a kérelem érvénytelen törzsparamétereket tartalmaz, vagy userNamehiányzik egy mező req.body, a szerver a következőképpen válaszol:

{ "errors": [{ "location": "body", "msg": "userName is required", "param": "userName" }] }

Tehát, ha userNamevagy emailnem felelt meg az érvényesítési, akkor minden hiba által visszaadott .array()módszer a következő formátum alapértelmezés szerint:

{ "msg": "The error message", "param": "param name", "value": "param value", // Location of the param that generated this error. // It's either body, query, params, cookies or headers. "location": "body", // nestedErrors only exist when using the oneOf function "nestedErrors": [{ ... }] }

Amint láthatja, ez a modul valóban segít abban, hogy a legtöbb validációról önállóan gondoskodjunk. Fenntartja a kódminőséget is, és főleg az üzleti logikára koncentrál.

Ez volt a bevezetés az express-validator modult használó bemeneti hitelesítéshez, és nézze meg, hogyan érvényesítse az elem tömbjét, és hogyan készítheti el saját egyéni érvényesítését a sorozat 2. részében.

Megpróbáltam minden tőlem telhetőt, és remélem, hogy elég részletesen bemutattam a részleteket, hogy elindulhasson.

Ha bármilyen problémába ütközik , lépjen kapcsolatba vagy kommentelje alább.

Szívesen segítek :)

Kövesse Shailesh Shekhawat-t, hogy értesítést kapjon, ha új bejegyzést teszek közzé.

Ne habozzon tapsolni, ha érdemes olvasmánynak tartotta ezt!

Eredetileg 2018. szeptember 2-án jelent meg a 101node.io címen.