亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我應該總是在 express 中編譯 Ajv 模式嗎?

我應該總是在 express 中編譯 Ajv 模式嗎?

12345678_0001 2022-12-02 16:46:45
我想使用Ajv 驗證器來驗證我的應用程序的請求主體express。要使用驗證器,我們首先需要編譯要測試的模式,然后運行驗證,如下所示:const Ajv = require('Ajv');const ajv = new Ajv();const schema = {  type: 'object',  required: ['username', 'password'],  properties: {    username: {      type: 'string',      minLength: 3,    },    password: {      type: 'string',      minLength: 8,    },  },};/* What we want to validate */const body = {  username: 'johndoe',  password: 'secret'};/* We compile the validator */const validate = ajv.compile(schema.query)/* We test our data to see if it is valid */const valid = validate(body)我應該在調用端點時始終編譯驗證器,以便將其包含在我的路由中,還是可以將編譯過程留在路由主體之外?
查看完整描述

2 回答

?
尚方寶劍之說

TA貢獻1788條經驗 獲得超4個贊

在嘗試了 Josh Wulf 的回答后,我確認它可以在路由處理程序之外編譯驗證器。


雖然它按預期工作并且可以在路由處理程序之外進行編譯,但我注意到它有一個缺點。


了解驗證器檢測到哪些錯誤的方法是調用validate.errors:


var validate = ajv.compile(schema);

var valid = validate(data);


if (!valid) {

  console.log(validate.errors);

}

因此,我們不應該在路由處理程序之外編譯驗證器,因為可能會出現并發問題。


由于驗證器在對同一路由的不同請求中是相同的,因此訪問驗證器的errors屬性可能會返回另一個客戶端的錯誤。


查看完整回答
反對 回復 2022-12-02
?
慕俠2389804

TA貢獻1719條經驗 獲得超6個贊

您應該在路由處理程序之外編譯一次,然后在處理程序中重用已編譯的模式。

這將提高性能——你只需要在它改變時編譯它。


查看完整回答
反對 回復 2022-12-02
  • 2 回答
  • 0 關注
  • 117 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號