いくつかの入力データを検証するためにexpress-validatorでexpress.jsを使い始めたところですが、バージョン4.0.0で導入された新しいチェックAPIでリクエスト本文にアクセスする際に問題が発生します。
古いバージョンでは、body-parserの後のどこかにapp.jsのミドルウェアとしてexpress-validatorを追加しただけです。
_// ./app.js
const bodyParser = require("body-parser");
const expressValidator = require("express-validator");
const index = require("./routes/index");
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(expressValidator());
_
次に、インデックスルートで、postメソッドの最後のコールバック関数のフィールドを確認できます。
_// ./routes/index.js
const express = require("express");
const router = express.Router();
router.post("/submit", (req, res, next) => {
// check email
req.check('email','Invalid email address').isEmail()
// check if password is equal to password confirmation
req.check('password', 'Invalid password')
/* Access request body to compare password
field with password confirmation field */
.equals(req.body.confirmPassword)
// get errors
const errors = req.validationErrors();
// do stuff
});
_
この例のように、自分のパスワードフィールドとフォームのパスワード確認フィールドの値が等しいかどうかを簡単に確認できます。ただし、バージョン4以降、ルーターファイルにexpress-validatorを直接ロードし、postメソッドの最後のコールバックの前に関数の配列としてチェック関数を渡す必要がある新しいAPIがあります。
_// ./routes/index.js
const express = require("express");
const router = express.Router();
const { check, validationResult } = require("express-validator/check");
router.post(
"/submit",
[
// Check validity
check("email", "Invalid email").isEmail(),
// Does not work since req is not defined
check("password", "invalid password").isLength({ min: 4 })
.equals(req.body.confirmPassword) // throws an error
],
(req, res, next) => {
// return validation results
const errors = validationResult(req);
// do stuff
});
_
Reqが定義されていないため、これは機能しません。ですから、私の質問は次のとおりです。check()
チェーン内のリクエストオブジェクトにアクセスして、2つの異なるフィールドを新しいexpress-validator APIと比較するにはどうすればよいですか?よろしくお願いします!
しばらくいじった後、カスタムバリデーターを使用してこれを実現する方法を見つけました。カスタムメソッドに渡されるバリデータ関数は、リクエスト本文を含むオブジェクトを受け入れます。
router.post(
"/submit",
[
// Check validity
check("email", "Invalid email").isEmail(),
check("password", "invalid password")
.isLength({ min: 4 })
.custom((value,{req, loc, path}) => {
if (value !== req.body.confirmPassword) {
// trow error if passwords do not match
throw new Error("Passwords don't match");
} else {
return value;
}
})
],
(req, res, next) => {
// return validation results
const errors = validationResult(req);
// do stuff
});