node.js中joi模塊的基本使用方式
node.js joi模塊的使用
//引入joi模塊 const Joi = require('joi'); //定義對象的驗證規(guī)則 const schema = { username: Joi.string().min(2).max(5).required().error(new Error('username屬性沒有通過驗證')), birth: Joi.number().min(1900).max(2020).error(new Error('birth沒有通過驗證')) }; async function run() { try { //實施驗證 await Joi.validate({ username: 'ab', birth: 1800 }, schema); } catch (ex) { console.log(ex.message); return; } console.log('驗證通過'); } run();
參數(shù)校驗:使用joi
在編寫api的時候通常都需要對參數(shù)進(jìn)行校驗,包括:
- 參數(shù)的類型、必填等;
- 字符串,是否可以為空、該符合什么規(guī)則等;
- 數(shù)字,最大值最小值是什么等等等等。
Joi 是 hapijs 自帶的數(shù)據(jù)校驗?zāi)K,他已經(jīng)高度封裝常用的校驗功能。
安裝及使用:
npm install joi --save import Joi from 'joi'
基礎(chǔ)使用
使用joi進(jìn)行校驗,首先要定義它的校驗規(guī)則,也叫schema。
const schema = Joi.string()
上面就定義了一個校驗字符串類型的規(guī)則,這個schema會有一個 validate方法,傳入需要校驗的值:
const result = schema.validate('1') console.log(result) // 此時result為 { value: '1' }
validate方法會返回一個對象,如果驗證通過,就只會返回value屬性,如果驗證錯誤,就還有一個error對象,其中error對象的message描述了失敗原因:
const schema = Joi.string() const result = schema.validate(1) console.log(result) // result: { ? value: 1, ? error: [Error [ValidationError]: "value" must be a string] { ? ? _original: 1, ? ? details: [ [Object] ] ? } } console.log(result.error.message) // "value" must be a string
常見schema
字符串、支持空字符串、必填(不能為undefined)
Joi.string().allow('').required()
數(shù)字、最小值18、最大值35
Joi.number().min(18).max(35)
數(shù)組、長度為3、子元素為字符串、
Joi.array().items(Joi.string()).length(3)
對象、只有p1屬性且為字符串
Joi.object({ ?? ?p1: Joi.string() })
函數(shù)
Joi.func()
日期
Joi.date()
任意
Joi.any()
正則regex
Joi.string().pattern(/\d/ig)
為空 undefined
Joi.empty()
列舉可選值,用valid;age只能取14, 16, 18 中的其一
a字段的校驗規(guī)則要根據(jù)b字段的規(guī)則確定;(疑問?:age為數(shù)組的話,childAge為數(shù)組值中一個?)
指向其他屬性用ref、ancestor往上層對象中查找,找不到就驗證失敗
const schema = Joi.object({ ?? ?age: Joi.number().valid(14, 16, 18), ?? ?childAge: Joi.number().valid(Joi.in('age')), ?? ?childAgeBack: Joi.ref('childAge'), ?? ?childAgeBack1: Joi.ref('childAge', {ancestor: 2}), })
with、without、xor
with
: 全選。 表示當(dāng)設(shè)置的屬性有一個出現(xiàn)了,其他也必須出現(xiàn),上面的例子設(shè)置了a、b屬性,需要同時存在或者同時不存在。without
: 二者擇其一。第一個參數(shù)設(shè)置條件字段,第二個參數(shù)為字段數(shù)組,表示第一個參數(shù)字段存在的話,第二個參數(shù)數(shù)組里面的字段都不能存在。上面的例子就是當(dāng)a字段出現(xiàn)時,b字段就不能存在。xor
: 一個或多個。表示設(shè)置的參數(shù)需要任何一個或多個存在。
const schema = Joi.object({ ? a: Joi.any(), ? b: Joi.any() }).with('a', 'b'); const schema = Joi.object({ ? a: Joi.any(), ? b: Joi.any() }).without('a', ['b']); const schema = Joi.object({ ? a: Joi.any(), ? b: Joi.any() }).xor('a', 'b');
when
: 相當(dāng)于條件判斷,第一個參數(shù)傳遞屬性名,is相當(dāng)于if,then后面就是is為真的時候的校驗條件?!緈ode字段只允許傳入’email’和’phone’,當(dāng)mode字段為’email’的時候,address字段就會進(jìn)行email校驗(joi自帶的字符串郵箱校驗)】
const schema = Joi.object({ ? mode: Joi.string().allow('email', 'phone').required(), ? address: Joi.string().when('mode', { is: 'email', then: Joi.string().email() }).required() });
特殊情況
Joi.string()
默認(rèn)情況不支持空字符串required()
必須放在最后,因為返回值為undefined
如果沒有required(),可以不填值,填了就要遵循規(guī)則
對象schema中,默認(rèn)不能傳入指定外的屬性。如果需要允許其他屬性的出現(xiàn),需要在跟上一個unknown方法。
const { error } = schema.validate({ ? name: 'chaorenya' }).unknown() // 允許出現(xiàn)其他字段
Joi.number()
校驗數(shù)字類型、如果字符串可以轉(zhuǎn)換convert為數(shù)字,那么默認(rèn)也會pass。Joi.number()
默認(rèn)只支持js的safe范圍(Number.MIN_SAFE_INTEGER & Number.MAX_SAFE_INTEGER))的數(shù)值;非safe范圍需要指明:Joi.number().unsafe()
demos
// demo1 ? if ((!req.body.keyList || !req.body.keyList.length) && !req.body.hasFilter) { ? ? return new req.Exception(`keyList / hasFilter ${req.ReturnMessages.INVALID}`) ? } // joi ed const schema = Joi.object({ ? ? keyList: Joi.when('hasFilter', { is: Joi.not(true), then: Joi.array().min(1).required() }), ? ? hasFilter: Joi.boolean() ? }) // demo2 ?if (!['FAT', 'FWS'].includes(ENV)) { ? ? return new req.Exception('env INVALID') ? } // joi ed const schema = Joi.object({ ? ?? ?env:Joi.string().valid('FAT', 'FWS').insensitive().required() ? }) // 或者可以轉(zhuǎn)換為大寫再比較,Joi.string().uppercase().valid().required() ?
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Node.js的Koa實現(xiàn)JWT用戶認(rèn)證方法
本篇文章主要介紹了Node.js的Koa實現(xiàn)JWT用戶認(rèn)證方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05Nuxt配合Node在實際生產(chǎn)中的應(yīng)用詳解
這篇文章主要介紹了Nuxt配合Node在實際生產(chǎn)中的應(yīng)用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08node?puppeteer爬蟲爬取電影網(wǎng)站及生成pdf文檔示例
這篇文章主要介紹了node?puppeteer爬蟲爬取電影網(wǎng)站及生成pdf文檔使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07