使用express-validator驗證Express中的輸入

了解如何驗證Express端點中作為輸入輸入的任何數據

假設您的POST端點接受名稱,電子郵件和年齡參數:

const express = require('express')
const app = express()

app.use(express.json())

app.post(’/form’, (req, res) => { const name = req.body.name const email = req.body.email const age = req.body.age })

如何對這些結果執行服務器端驗證,以確保:

  • 名稱是至少3個字符的字符串嗎?
  • 電子郵件是真實的電子郵件嗎?
  • 年齡是一個數字,介於0到110之間?

處理來自Express中來自外部的任何輸入的驗證的最佳方法是使用express-validator包裹

npm install express-validator

您需要checkvalidationResult包中的對象:

const { check, validationResult } = require('express-validator');

我們傳遞一個數組check()調用作為的第二個參數post()稱呼。每一個check()call接受參數名稱作為參數。然後我們打電話validationResult()驗證沒有驗證錯誤。如果有的話,我們告訴客戶:

app.post('/form', [
  check('name').isLength({ min: 3 }),
  check('email').isEmail(),
  check('age').isNumeric()
], (req, res) => {
  const errors = validationResult(req)
  if (!errors.isEmpty()) {
    return res.status(422).json({ errors: errors.array() })
  }

const name = req.body.name const email = req.body.email const age = req.body.age })

注意我用過

  • isLength()
  • isEmail()
  • isNumeric()

這些方法還有很多,全部來自驗證器.js, 包括:

  • contains(),檢查值是否包含指定值
  • equals(),檢查值是否等於指定值
  • isAlpha()
  • isAlphanumeric()
  • isAscii()
  • isBase64()
  • isBoolean()
  • isCurrency()
  • isDecimal()
  • isEmpty()
  • isFQDN(),是完全合格的域名嗎?
  • isFloat()
  • isHash()
  • isHexColor()
  • isIP()
  • isIn(),請檢查該值是否在允許值的數組中
  • isInt()
  • isJSON()
  • isLatLong()
  • isLength()
  • isLowercase()
  • isMobilePhone()
  • isNumeric()
  • isPostalCode()
  • isURL()
  • isUppercase()
  • isWhitelisted(),對照允許的字符白名單檢查輸入

您可以使用正則表達式來驗證輸入matches()

可以使用檢查日期

  • isAfter(),檢查輸入的日期是否在您通過的日期之後
  • isBefore(),檢查輸入的日期是否在您通過的日期之前
  • isISO8601()
  • isRFC3339()

有關如何使用這些驗證器的確切詳細信息,請參閱https://github.com/chriso/validator.js#validators

所有這些檢查可以通過以下方式組合使用:

check('name')
  .isAlpha()
  .isLength({ min: 10 })

如果有任何錯誤,服務器將自動發送響應以傳達錯誤。例如,如果電子郵件無效,將返回以下內容:

{
  "errors": [{
    "location": "body",
    "msg": "Invalid value",
    "param": "email"
  }]
}

您可以使用以下命令為每次檢查覆蓋此默認錯誤:withMessage()

check('name')
  .isAlpha()
  .withMessage('Must be only alphabetical chars')
  .isLength({ min: 10 })
  .withMessage('Must be at least 10 chars long')

如果您想編寫自己的特殊定制驗證器怎麼辦?您可以使用custom驗證器。

在回調函數中,您可以通過引發異常或返回被拒絕的承諾來拒絕驗證:

app.post('/form', [
  check('name').isLength({ min: 3 }),
  check('email').custom(email => {
    if (alreadyHaveEmail(email)) {
      throw new Error('Email already registered')
    }
  }),
  check('age').isNumeric()
], (req, res) => {
  const name  = req.body.name
  const email = req.body.email
  const age   = req.body.age
})

定制驗證器:

check('email').custom(email => {
  if (alreadyHaveEmail(email)) {
    throw new Error('Email already registered')
  }
})

可以改寫成

check('email').custom(email => {
  if (alreadyHaveEmail(email)) {
    return Promise.reject('Email already registered')
  }
})

免費下載我的Express.js手冊


更多速成教程: