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 body
param
query
.
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át
if (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 route
validá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.js
fá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.js
lesz:
router.post( '/', userController.validate('createUser'), userController.createUser, )
Itt userController.validate
van egy köztes szoftver funkció, amelyet az alábbiakban ismertetünk. Elfogadja azt a method
nevet, 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 body
fü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 required
mező esetében a .exists()
módszert használjuk. Mi használ .optional()
egy optional
mező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 enabled
vagy disabled
értéke lehet. Ha ettől eltérő értéket ad meg, hiba lép fel.
A /controllers/user.js
Írjunk egy createUser
funkció, 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 userName
hiá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 userName
vagy email
nem 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.