V předchozím příspěvku jsem ukázal, jak začít s ověřováním vstupu v aplikaci express.js. Použil jsem modul express-validator a probral jsem jeho důležité funkce s implementací.
Pokud jste to nezkontrolovali, přečtěte si první příspěvek zde.
Takže teď začneme. V části 2 tohoto tutoriálu se dozvíte, jak provádět vlastní ověření v aplikaci Express.js.
Co můžete dosáhnout pomocí vlastního ověření
- Lze jej použít k ověření existence entity ve vaší databázi.
- Také k testování, zda určitá hodnota existuje v poli, objektu, řetězci atd.
- Pokud chcete změnit samotný formát dat.
A mnohem více…
Knihovna express-validator poskytuje custom
metoda, kterou můžete použít k provádění nejrůznějších vlastních validací
Implementace vlastního validátoru využívá řetězovou metodu .custom(). Vyžaduje funkci validátoru.
Vlastní validátory vrátí Promises k zobrazení asynchronního ověření nebo throw
jakákoli hodnota/odmítnout příslib použití vlastní chybové zprávy.
Nyní vám ukážu příklady výše uvedených případů použití vlastní validace.
Zkontrolujte, zda entita ve vaší databázi existuje
Důležitý, který používám každý den – a myslím, že ho budete používat k ověření entity proti databázi
Pokud například někdo požádá o aktualizaci svého jména, použijete jej pro základní PUT
požadavek /api/users/:userId
.
Abych se ujistil, že uživatel by měl existovat v naší databázi, vytvořil jsem funkci pro kontrolu proti DB.
param('userId')
.exists()
.isMongoId()
.custom(val => UserSchema.isValidUser(val))
isValidUser()
je statická funkce, která provede asynchronní volání do databáze a zjistí, zda uživatel existuje nebo ne.
Pojďme napsat statickou funkci v mongooseSchema
:
UserSchema.statics = {
isValid(id) {
return this.findById(id)
.then(result => {
if (!result) throw new Error('User not found')
})
},
}
Protože nemůžeme důvěřovat userId
odeslané klientem pouze na základě jeho formátu, musíme se ujistit, že se jedná o skutečný účet.
Ověření proti určitým hodnotám v poli nebo objektu
Pokud například chcete použít pravidlo na uživatelské jméno že musí mít znak @
.
Takže ve vašem POST
žádost o vytvoření uživatele nebo během aktualizace, můžete udělat něco takového:
body('username', 'Invalid Username')
.exists()
.isString().isLowercase()
.custom(val => {
if (val.indexOf('@') !== -1) return true
return false
}),
Pamatujte si:Vždy vraťte booleovskou hodnotu ze zpětného volání .custom()
funkce. Jinak by vaše ověření nemuselo fungovat tak, jak chcete. Jak vidíte, všechna tato ověření můžeme provést včetně asynchronního v samotném middlewaru místo toho, abychom je prováděli v řadiči
Změna formátu vstupních dat
Knihovna má funkci dezinfekce, kde se vlastní dezinfekce provádí pomocí customerSanitizer()
.
Použil jsem to ke změně řetězce hodnot oddělených čárkou na pole řetězců.
Máme například databázi lékařů. Někdo chce získat pouze lékaře, kteří jsou kardiology a psychiatři.
Obě tyto specializace jsme uložili jako type
v naší databázi.
Jednoduchý GET
požadavek bude vypadat takto:
GET /api/doctors?type=cardiologists,psychiatrist
Nyní v mongodb
můžeme použít $in
operátor pro vyhledávání více hodnot vlastnosti.
Základní databázový dotaz může vypadat takto:
Doctors.find({
type: {
$in: ['cardiologists', 'psychiatrist']
}
})
Tím získáte všechny kardiology a psychiatry.
Od GET
dotaz:
req.query = {
type: "cardiologists,psychiatrist"
}
Jak můžete vidět v req.query
, získáte vlastnost type
jehož typ je string
.
S pomocí .customSanitizer()
jsme schopni převést řetězec na pole řetězců.
Na úrovni ověření:
const commaToArray = (value = '') => value.split(',')
sanitizeQuery('type').customSanitizer(commaToArray),
Nyní jej můžeme přímo vložit do databázového dotazu na $in
operátor.
Co když chci použít některá pravidla na všechny položky v poli nebo klíče v objektech?
přes GIPHY
Text:
{
items:[
{_id: 'someObjectId', number: '200'},
...
]
}
Zástupné znaky
Zástupný znak je jednou ze skvělých funkcí tohoto modulu. Umožňuje vám iterovat pole položek nebo klíčů objektů a ověřit každou položku nebo její vlastnosti.
*
znak je také známý jako zástupný znak.
Představte si, že chci ověřit všechny _id, number
položek.
check('items.*._id')
.exists()
.isMongoId()
.custom(val => ItemSchema.isValid(val)), //similar to isValidUser()
sanitize('items.*.number').toInt()
Tady to máte — úvod do ověřování vstupu pomocí modulu express-validator
Pokud narazíte na nějaké problémy, neváhejte kontaktovat nebo komentovat níže.
Rád pomohu :)
Neváhejte tleskat, pokud to považujete za užitečné čtení!
Sledujte Shailesh Shekhawat, abyste byli informováni, kdykoli zveřejním nový příspěvek.
Původně publikováno na 101node.io 22. září 2018.