web-dev-qa-db-ja.com

express-validatorv4のチェック機能でリクエスト本文にアクセス

いくつかの入力データを検証するために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と比較するにはどうすればよいですか?よろしくお願いします!

5
Martin Reiche

しばらくいじった後、カスタムバリデーターを使用してこれを実現する方法を見つけました。カスタムメソッドに渡されるバリデータ関数は、リクエスト本文を含むオブジェクトを受け入れます。

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
    });
29
Martin Reiche