最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

node.js中joi模塊的基本使用方式

 更新時(shí)間:2022年09月05日 11:45:15   作者:江呱呱  
這篇文章主要介紹了node.js中joi模塊的基本使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

node.js joi模塊的使用

//引入joi模塊
const Joi = require('joi');
//定義對(duì)象的驗(yàn)證規(guī)則
const schema = {
    username: Joi.string().min(2).max(5).required().error(new Error('username屬性沒有通過驗(yàn)證')),
    birth: Joi.number().min(1900).max(2020).error(new Error('birth沒有通過驗(yàn)證'))
};
async function run() {
    try {
        //實(shí)施驗(yàn)證
        await Joi.validate({ username: 'ab', birth: 1800 }, schema);
    } catch (ex) {
        console.log(ex.message);
        return;
    }
    console.log('驗(yàn)證通過');
}
run();

參數(shù)校驗(yàn):使用joi

在編寫api的時(shí)候通常都需要對(duì)參數(shù)進(jìn)行校驗(yàn),包括:

  • 參數(shù)的類型、必填等;
  • 字符串,是否可以為空、該符合什么規(guī)則等;
  • 數(shù)字,最大值最小值是什么等等等等。

Joi 是 hapijs 自帶的數(shù)據(jù)校驗(yàn)?zāi)K,他已經(jīng)高度封裝常用的校驗(yàn)功能。

安裝及使用:

npm install joi --save
import Joi from 'joi'

基礎(chǔ)使用

使用joi進(jìn)行校驗(yàn),首先要定義它的校驗(yàn)規(guī)則,也叫schema。

const schema = Joi.string()

上面就定義了一個(gè)校驗(yàn)字符串類型的規(guī)則,這個(gè)schema會(huì)有一個(gè) validate方法,傳入需要校驗(yàn)的值:

const result = schema.validate('1')
console.log(result)
// 此時(shí)result為 { value: '1' }

validate方法會(huì)返回一個(gè)對(duì)象,如果驗(yàn)證通過,就只會(huì)返回value屬性,如果驗(yàn)證錯(cuò)誤,就還有一個(gè)error對(duì)象,其中error對(duì)象的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ù)組、長(zhǎng)度為3、子元素為字符串、

Joi.array().items(Joi.string()).length(3)

對(duì)象、只有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字段的校驗(yàn)規(guī)則要根據(jù)b字段的規(guī)則確定;(疑問?:age為數(shù)組的話,childAge為數(shù)組值中一個(gè)?)

指向其他屬性用ref、ancestor往上層對(duì)象中查找,找不到就驗(yàn)證失敗

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è)置的屬性有一個(gè)出現(xiàn)了,其他也必須出現(xiàn),上面的例子設(shè)置了a、b屬性,需要同時(shí)存在或者同時(shí)不存在。
  • without: 二者擇其一。第一個(gè)參數(shù)設(shè)置條件字段,第二個(gè)參數(shù)為字段數(shù)組,表示第一個(gè)參數(shù)字段存在的話,第二個(gè)參數(shù)數(shù)組里面的字段都不能存在。上面的例子就是當(dāng)a字段出現(xiàn)時(shí),b字段就不能存在。
  • xor: 一個(gè)或多個(gè)。表示設(shè)置的參數(shù)需要任何一個(gè)或多個(gè)存在。 
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)于條件判斷,第一個(gè)參數(shù)傳遞屬性名,is相當(dāng)于if,then后面就是is為真的時(shí)候的校驗(yàn)條件?!緈ode字段只允許傳入’email’和’phone’,當(dāng)mode字段為’email’的時(shí)候,address字段就會(huì)進(jìn)行email校驗(yàn)(joi自帶的字符串郵箱校驗(yàn))】
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()必須放在最后,因?yàn)榉祷刂禐閡ndefined

如果沒有required(),可以不填值,填了就要遵循規(guī)則

對(duì)象schema中,默認(rèn)不能傳入指定外的屬性。如果需要允許其他屬性的出現(xiàn),需要在跟上一個(gè)unknown方法。

const { error } = schema.validate({
? name: 'chaorenya'
}).unknown() // 允許出現(xiàn)其他字段
  • Joi.number()校驗(yàn)數(shù)字類型、如果字符串可以轉(zhuǎn)換convert為數(shù)字,那么默認(rèn)也會(huì)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() ?

參考:官網(wǎng)API文檔

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 進(jìn)階之初探nodeJS

    進(jìn)階之初探nodeJS

    本文主要介紹了nodeJS的相關(guān)知識(shí)。具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-01-01
  • node.js生成與讀取csv文件方法詳解

    node.js生成與讀取csv文件方法詳解

    這篇文章主要介紹了node.js生成與讀取csv文件方法詳解,需要的朋友可以參考下
    2022-10-10
  • 通過Nodejs搭建網(wǎng)站簡(jiǎn)單實(shí)現(xiàn)注冊(cè)登錄流程

    通過Nodejs搭建網(wǎng)站簡(jiǎn)單實(shí)現(xiàn)注冊(cè)登錄流程

    這篇文章主要介紹了通過Nodejs搭建網(wǎng)站簡(jiǎn)單實(shí)現(xiàn)注冊(cè)登錄流程,Node.js 是一個(gè)基于 Chrome V8 引擎的 JavaScript 運(yùn)行環(huán)境。 Node.js 使用了一個(gè)事件驅(qū)動(dòng)、非阻塞式 I/O 的模型,使其輕量又高效。,需要的朋友可以參考下
    2019-06-06
  • Nodejs Buffer的使用及Stream流和事件機(jī)制詳解

    Nodejs Buffer的使用及Stream流和事件機(jī)制詳解

    這篇文章主要為大家介紹了Nodejs Buffer的使用及Stream流和事件機(jī)制詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • express框架中使用jwt實(shí)現(xiàn)驗(yàn)證的方法

    express框架中使用jwt實(shí)現(xiàn)驗(yàn)證的方法

    這篇文章主要給大家介紹了關(guān)于express框架中使用jwt實(shí)現(xiàn)驗(yàn)證的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用express具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 掌握Node.js中的Promise異步編程方式

    掌握Node.js中的Promise異步編程方式

    Node.js中的Promise是一種異步編程方式,可以解決回調(diào)地獄問題,提高代碼可讀性和可維護(hù)性。通過掌握Promise的使用方法,可以更好地進(jìn)行異步編程,避免一些常見的錯(cuò)誤和陷阱
    2023-05-05
  • socket.io與pm2(cluster)集群搭配的解決方案

    socket.io與pm2(cluster)集群搭配的解決方案

    這篇文章主要給大家介紹了關(guān)于socket.io與pm2(cluster)集群搭配的解決方案,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來看看吧。
    2017-06-06
  • 在Nodejs中實(shí)現(xiàn)一個(gè)緩存系統(tǒng)的方法詳解

    在Nodejs中實(shí)現(xiàn)一個(gè)緩存系統(tǒng)的方法詳解

    在數(shù)據(jù)庫查詢遇到瓶頸時(shí),我們通??梢圆捎镁彺鎭硖嵘樵兯俣?同時(shí)緩解數(shù)據(jù)庫壓力,在一些簡(jiǎn)單場(chǎng)景中,我們也可以自己實(shí)現(xiàn)一個(gè)緩存系統(tǒng),避免使用額外的緩存中間件,這篇文章將帶你一步步實(shí)現(xiàn)一個(gè)完善的緩存系統(tǒng),需要的朋友可以參考下
    2024-03-03
  • npm淘寶鏡像過期解決辦法

    npm淘寶鏡像過期解決辦法

    npm?官方鏡像在國(guó)內(nèi)訪問很慢,很多同學(xué)都會(huì)選擇切換到國(guó)內(nèi)的一些 npm 鏡像,本文主要介紹了npm淘寶鏡像過期解決辦法,感興趣的可以了解一下
    2024-02-02
  • node.js中koa和express的差異對(duì)比

    node.js中koa和express的差異對(duì)比

    Express和koa都是服務(wù)端的開發(fā)框架,服務(wù)端開發(fā)的重點(diǎn)是對(duì)HTTP Request和HTTP Response兩個(gè)對(duì)象的封裝和處理,下面這篇文章主要給大家介紹了關(guān)于node.js中koa和express的差異對(duì)比,需要的朋友可以參考下
    2023-05-05

最新評(píng)論

绥宁县| 房产| 金昌市| 西林县| 湟源县| 前郭尔| 肇州县| 本溪| 西青区| 新宾| 廉江市| 南部县| 灌云县| 永年县| 沅陵县| 湘阴县| 民和| 恩施市| 微山县| 九台市| 剑川县| 桐柏县| 溧水县| 广宁县| 姜堰市| 彝良县| 出国| 七台河市| 波密县| 正镶白旗| 伽师县| 贵港市| 长丰县| 公安县| 曲周县| 太和县| 开封县| 五台县| 瑞安市| 南靖县| 怀宁县|