Jak provést vlastní ověření v aplikaci Express.js (část 2)

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.