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

あなたはcheckそしてvalidationResultパッケージのオブジェクト:

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

の配列を渡しますcheck()の2番目の引数として呼び出すpost()コール。すべてcheck()呼び出しは、パラメーター名を引数として受け入れます。次に、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()

これらの方法は他にもたくさんありますが、すべてvalidator.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バリデーター。

コールバック関数では、例外をスローするか、拒否されたpromiseを返すことにより、検証を拒否できます。

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ハンドブック


より明確なチュートリアル: