前回は、Express で CORS エラーを解消しました。

今回は、express-vaidator を使って、バックエンドで POST データの検証をします。

コードは、前回までのコードを使用します。

index.js

const express = require("express")
const bookRoutes = require("./routes/book")
const bodyParser = require("body-parser")

const app = express()

app.use(bodyParser.json())

app.use((req, res, next) => {
  res.setHeader("Access-Control-Allow-Origin", "*")
  res.setHeader(
    "Access-Control-Allow-Methods",
    "GET, POST, PUT, PATCH, DELETE, OPTION"
  )
  res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization")
  next()
})

app.use("/book", bookRoutes)

app.listen(8000, () => console.log("Server is running ..."))

routes/book.js

const express = require("express")

const bookController = require("../controllers/book")

const router = express.Router()

router.get("/get", bookController.getBook)

router.post("/post", bookController.postBook)

module.exports = router

controllers/book.js

exports.getBook = (req, res, next) => {
  res.status(200).json({
    books: [
      {
        id: "aaaaaa",
        title: "オズの魔法使い",
        content: "前に進んでいったら、何とかなるという話。",
      },
    ],
  })
}

exports.postBook = (req, res, next) => {
  const id = (Math.random() + 1).toString(36).slice(2, 8)
  const title = req.body.title
  const content = req.body.content
  res.status(201).json({
    message: "Data transmission completed!",
    post: { id: id, title: title, content: content },
  })
}

express-vaidator を使うと、送信されたデータ内容が正しいか間違っているか検証してくれる様になります。

まずは、express-vaidator をインストールします。

ターミナルでnpm install --save express-validator実行します。

次に、どの状況だと検証で引っ掛かるかを設定します。

routes フォルダの book.js を開きます。

express-vaidator からbodyを呼び出します。

const { body } = require("express-validator")

今回は、content が 4 文字未満の場合、エラーが発生する様にします。

文字列の長さを指定するときは、isLength を使用します。

また、余計な空白を削除するため、trim を使用します。

router.post(
  "/post",
  body("content").trim().isLength({ min: 4 }),
  bookController.postBook
)

min: 4とすることで、4 文字未満の場合、エラーが発生する様になりました。

最後に、エラーが発生した場合、どう処理するかを設定します。

controllers フォルダの book.js を開きます。

express-validator からvalidationResultを呼び出します。

validationResultで検証結果を指定します。

exports.postBook = (req, res, next) => {
  const errors = validationResult(req)

  const id = (Math.random() + 1).toString(36).slice(2, 8)
  const title = req.body.title
  const content = req.body.content
  res.status(201).json({
    message: "Data transmission completed!",
    post: { id: id, title: title, content: content },
  })
}

errors が空欄ではない場合、つまりエラーが発生している場合、メッセージを表示する様にします。

exports.postBook = (req, res, next) => {
  const errors = validationResult(req)
  if (!errors.isEmpty()) {
    return res
      .status(400)
      .json({ message: "validation errors", errors: errors.array() })
  }
  const id = (Math.random() + 1).toString(36).slice(2, 8)
  const title = req.body.title
  const content = req.body.content
  res.status(201).json({
    message: "Data transmission completed!",
    post: { id: id, title: title, content: content },
  })
}

一通り完成したので、Postman で確認します。

まずは、文字列が 4 文字以上の場合です。

image2

送信ができました。

次は、文字列が 4 文字未満の場合です。

image3

express-validator で設定した通り、エラーが表示されました。

ブログ一覧