2013-07-13 130 views
10

我使用express驗證器進行驗證。我使用貓鼬數據庫,它也有內置的驗證。我想知道我應該使用哪一個?快速驗證器中的驗證

我也想知道express-validator中的驗證是否平行。拿這個代碼,例如:

req.checkBody('email', 'Invalid email').notEmpty().isEmail().isUnique(); 
req.checkBody('password', 'Invalid possword').notEmpty().len(8, 30); 
req.checkBody('first_name', 'Invalid first_name').notEmpty().isAlpha(); 
req.checkBody('last_name', 'Invalid last_name').notEmpty().isAlpha(); 
req.checkBody('dateofbirth', 'Invalid dateofbirth').notEmpty.isDate(); 

isUnique設置()是來檢查,如果電子郵件尚未註冊與否,查詢數據庫來驗證這樣一個自定義的驗證方法。雖然沒有在上面的代碼中提到,但我也沒有幾個其他的post請求,我需要驗證多個字段,其中每個字段將在其中進行數據庫查詢。

所以我想知道它是否可能並行運行上述每個檢查方法,因爲這會使它更快,並且也會讓我更喜歡節點。我顯然希望使用一個模塊來並行運行這些模塊,比如async。我還想知道這些檢查方法是否已經平行運行?

請幫我弄清楚這一點?提前致謝。

回答

10

express-validator是爲了驗證瀏覽器/客戶端傳遞的輸入; Mongoose的驗證是爲了驗證新創建的文檔。兩者都有不同的目的,所以對於你應該使用哪一個來說並沒有一個明確的答案。你甚至可以使用兩者。

至於驗證的順序:檢查將連續進行。您可以使用async.parallel()使其出現就好像檢查並行執行一樣,但實際上它們不會是因爲檢查是同步的。

編輯node-validator(因此express-validator)是一個字符串驗證器。唯一性測試不是字符串操作,而是操作數據模型,因此您不應該嘗試使用node-validator(實際上,我甚至不認爲您可以可以)。

相反,我會建議使用Mongoose的unique功能來確保電子郵件地址只在您的數據庫中出現一次。

或者,使用支持異步操作的驗證程序模塊,如async-validate

+0

爲什麼我不能讓它們並行工作?我的意思是如果它做async.parallel(),那麼爲什麼它仍然是同步?在我看來,它們是創建錯誤的函數,在完成這些驗證後我們會檢查這些錯誤。如果我是正確的,那麼我們可以使用並行並在所有驗證完成後檢查錯誤。請澄清我的probs –

+0

'async.parallel'只會並行異步調用(I/O),而Express-validator-調用不是。請查看[相關文檔](https://github.com/ctavan/express-validator#validation-errors)瞭解如何處理錯誤(在完成所有驗證後也完成)。 – robertklep

+0

這是express-validator或node-validator的問題嗎?如果它的節點驗證器比我認爲它很難修復它?但如果它與表達驗證者相比我希望能做些什麼。 –

6

使用mongodb unique約束和express-validator會導致一些複雜的錯誤處理:您需要分析不同位置的錯誤並將其轉換爲通用格式以獲得休息響應。 所以另一種方法將創建自定義的明確的驗證,這將在MongoDB中找到記錄有這樣的價值:

router.use(expressValidator({ 
    customValidators: { 
     isUsernameAvailable(username) { 
     return new Promise((resolve, reject) => { 
      User.findOne({ username: username }, (err, user) => { 
      if (err) throw err; 
      if(user == null) { 
       resolve(); 
      } else { 
       reject(); 
      } 
      }); 
     }); 
     } 
    } 
    }) 
); 

... 
req.checkBody('username', 'Username is required').notEmpty(); 
req.checkBody('username', 'Username already in use').isUsernameAvailable(); 


req.asyncValidationErrors().then(() => { 
... 

如果需要,請參閱該代碼在我的網站總例如:https://maketips.net/tip/161/validate-username-available-using-express-validator

結論:express-validator還支持異步驗證,因此您可以執行任何數據和字符串驗證,而無需混合用戶驗證和低級別數據庫後端驗證