日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

eggjs的参数校验模块egg-validate的使用和进一步定制化升级

發(fā)布時(shí)間:2023/12/18 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 eggjs的参数校验模块egg-validate的使用和进一步定制化升级 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡單講一下這個(gè)egg-validate

egg-validate是基于parameter的。

安裝
npm install --save egg-validate

啟用

// config/plugin.js exports.validate = {enable: true,package: 'egg-validate', };

配置

// config/config.default.js exports.validate = {// convert: false,// validateRoot: false, };

用途嘛,就是對參數(shù)進(jìn)行檢驗(yàn)。比如檢驗(yàn)一個(gè)用戶名是不是字符串,可以這么寫,
ctx.validate({ userName: 'string' });
默認(rèn)就會對ctx.request.body進(jìn)行檢驗(yàn)
你想檢驗(yàn)ctx.query的話,那就ctx.validate({ userName: 'string' }, ctx.query);,params就ctx.params。
它會在檢驗(yàn)失敗的拋出一個(gè)異常,沒有捕獲的話,會返回一個(gè)422錯(cuò)誤。

第二種使用方法:

let errs = app.validator.validate({ userName: 'string' }, ctx.request.body);

ctx.validate檢驗(yàn)不通過會拋出異常,而app.validator.validate檢驗(yàn)不通過會返回錯(cuò)誤。你可以自己選擇要對這個(gè)錯(cuò)誤怎么處理,是不管呢還是返回前端。

關(guān)于校驗(yàn)規(guī)則rule

完全和parameter的校驗(yàn)規(guī)則一樣。建議直接看readme文檔,雖然是英文的,但是配著翻譯看個(gè)7788是差不多的。

ctx.validate({ userName: 'string' });這里面的rule就是{ userName: 'string' },它會這么檢驗(yàn),首先判斷這個(gè)userName有沒有在ctx.request.body里面,沒有就跑出參數(shù)不存在、然后是userName不能為空、然后得是string。有一個(gè)不符合都會拋出錯(cuò)誤。

你想判斷一個(gè)用戶的信息是否正確可以這么寫:

ctx.validate({userName: 'userName', // 自定義的校驗(yàn)規(guī)則password: 'password', // 自帶的校驗(yàn)規(guī)則sex: ['men', 'women'], // 性別是men或者womenage: {type: 'number', // 年齡范圍0-120min: 0,max: 120}});

這里有個(gè)坑,年齡怎么填都會報(bào)格式錯(cuò)誤,這是因?yàn)榕渲玫臅r(shí)候默認(rèn)把參數(shù)轉(zhuǎn)型關(guān)了,配置回來就好:

config.validate = { // 配置參數(shù)校驗(yàn)器,基于parameterconvert: true, // 對參數(shù)可以使用convertType規(guī)則進(jìn)行類型轉(zhuǎn)換// validateRoot: false, // 限制被驗(yàn)證值必須是一個(gè)對象。};

主要使用的幾個(gè)點(diǎn),核心使用

1、使用自帶的校驗(yàn)規(guī)則:

password: 'password',或者

password: {type: 'password',allowEmpty: true // 設(shè)置密碼為空,作為示例亂寫一下。。 }

校驗(yàn)規(guī)則有這些,文檔很詳細(xì)了:

2、自定義的校驗(yàn)規(guī)則

通過app.validator.addRule添加:

// 校驗(yàn)用戶名是否正確app.validator.addRule('userName', (rule, value)=>{ // value就是待檢驗(yàn)的數(shù)據(jù)if (/^\d+$/.test(value)) {return "用戶名應(yīng)該是字符串";}else if (value.length < 3 || value.length > 10) {console.log("用戶名的長度應(yīng)該在3-10之間");}});

這個(gè)可以直接放在app.js里面。return的就是錯(cuò)誤消息message,但是err不止這個(gè),還有錯(cuò)誤字段啊啥的、都會幫我們自動(dòng)包裝好。

3、app.validator.addRule('userName', (rule, value)=>{里面這個(gè)字符串'userName'

添加了這個(gè)規(guī)則就可以直接使用ctx.validate({userName: 'userName'});。
或者

ctx.validate({userName: {type: 'userName',isAdmin: true' });

4、app.validator.addRule('userName', (rule, value)=>{里面這個(gè)rule

像3、那樣的規(guī)則就是把

{type: 'userName',isAdmin: true' }

直接賦值給rule傳過來
{ type: 'userName', isAdmin: true }
然后你可以自己加判斷,比如如果 isAdmin的話,管理員用戶名不能有中文啊,長度至少5位啊啥的。

5、在哪里addRule

上面寫的是推薦大家在app.js里面addRule。為什么呢?
當(dāng)然你可以在任何你能取到app的地方調(diào)用app.validator.addRule('userName', (rule, value)=>{去addRule。

但是不建議在controller里面addRule。因?yàn)閏ontroller在每次路由匹配到之后都會進(jìn)行實(shí)例化,所以請求了n遍,也就執(zhí)行了這個(gè)addRule n遍。

而且代碼會變的很臃腫。不易于管理。

在app.js addRule當(dāng)然是很棒的,只在app加載時(shí)add一次。

但是問題又來了,隨著rule變多,你在app.js里面寫了很多代碼都是關(guān)于addRule的,但是app.js又不止要寫addRule、還寫了一些別的,那看起來多亂啊。也不利于管理。

如果將來新的項(xiàng)目要用到相同的校驗(yàn)規(guī)則難道還有從app.js里面手動(dòng)拷貝嗎。

所以下面接著講eggjs基于egg-validate的定制化升級

eggjs基于egg-validate的定制化升級

我們希望能達(dá)到怎么樣的一個(gè)效果呢?

  • app.js里面少寫一些代碼,最好就寫一兩行,做個(gè)配置這樣子
  • 對于所有的自定義校驗(yàn)規(guī)則獨(dú)立出文件夾,可以取名validate,就丟在app/下面
  • 針對相似的校驗(yàn)規(guī)則進(jìn)一步抽象成文件,就叫做user.js這樣,丟在app/validate/下面
  • 針對某一條特定的校驗(yàn)規(guī)則,如校驗(yàn)用戶的userName就丟在app/validate/user.js里面
  • 然后保持egg-validate的使用規(guī)則不變,原來是ctx.validate現(xiàn)在還是ctx.vallidate。同時(shí)其他的插件、配置不受影響。這叫做代碼侵入性小。
  • 下面照著這幾個(gè)目標(biāo)實(shí)現(xiàn)代碼

    首先把a(bǔ)pp.js里面導(dǎo)入模塊寫出來

    我們使用Loader來加載validate下面的所有文件:

    const path = require('path');module.exports = app => {// 你的其它代碼,balabala// 加載所有的校驗(yàn)規(guī)則const directory = path.join(app.config.baseDir, 'app/validate');app.loader.loadToApp(directory, 'validate'); }

    然后建立實(shí)際的校驗(yàn)規(guī)則文件

    建立app/validate/user.js文件

    寫入以下代碼

    module.exports = app =>{let { validator } = app;// 校驗(yàn)用戶名是否正確validator.addRule('userName', (rule, value)=>{console.log(rule);if (/^\d+$/.test(value)) {return "用戶名應(yīng)該是字符串";}else if (value.length < 3 || value.length > 10) {console.log("用戶名的長度應(yīng)該在3-10之間");}});// 添加自定義參數(shù)校驗(yàn)規(guī)則validator.addRule('123', (rule, value) => {if (value !== '123'){return 'must be 123';}}); };

    這里validator.addRule和原來一樣,只是為了少寫代碼,之前把validator取出來了:
    let { validator } = app;


    這樣定制化升級就完成了。之后需要再新建檢驗(yàn)規(guī)則就寫在validate里面,某一類相似校驗(yàn)規(guī)則要復(fù)用就直接拷貝文件就好了。

    有什么問題歡迎留言評論,看到盡量會回復(fù)。。。

    轉(zhuǎn)載于:https://www.cnblogs.com/hengyumo/p/11134619.html

    總結(jié)

    以上是生活随笔為你收集整理的eggjs的参数校验模块egg-validate的使用和进一步定制化升级的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。