Почему экспресс-валидатор не отклоняет этот запрос?

#express #express-validator

Вопрос:

почему экспресс-валидатор не отклоняет этот запрос?

 import { Router, Request, Response } from 'express'
import { header } from 'express-validator'

if (!process.env.CRONJOB_SECRET) {
  console.error('Please set CRONJOB_SECRET')
  process.exit(1)
}

const router = Router()

/**
 * start/stop jobs every minute
 */
router.get(
  '/start-stop-jobs',
  header('x-cronjob-secret').equals(process.env.CRONJOB_SECRET),
  async (req: Request, res: Response) => {
    const log = {
      secret: process.env.CRONJOB_SECRET,
      equals: req.headers['x-cronjob-secret'],
      started: [],
      stopped: [],
      error: {},
    }
    // stop any events
    console.log('Completed /start-stop-jobs', log)
    return res.json({ status: 'ok', log })
  },
)

 

Когда я GET /start-stop-jobs , без заголовка, получаю этот ответ:

 {"status":"ok","log":{"secret":"CRONJOB_SECRET","started":[],"stopped":[],"error":{}}}
 

Это кажется тривиальным вариантом использования. Чего мне не хватает?

Ответ №1:

Это должно быть связано с тем, что «экспресс-валидатор» нуждается в вызове другой validationResult функции. Согласно документу:

 // ...rest of the initial code omitted for simplicity.
const { body, validationResult } = require('express-validator');

app.post(
  '/user',
  // username must be an email
  body('username').isEmail(),
  // password must be at least 5 chars long
  body('password').isLength({ min: 5 }),
  (req, res) => {
    // Finds the validation errors in this request and wraps them in an object with handy functions
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
      return res.status(400).json({ errors: errors.array() });
    }

    User.create({
      username: req.body.username,
      password: req.body.password,
    }).then(user => res.json(user));
  },
);
 

Обратите внимание на вызов const errors = validationResult(req); после кодов спецификации проверки, приводящий к немедленному возврату res.status(400) в случае возникновения ошибок. Это недостающая часть в вашем коде.

Вы можете извлечь эту функциональность в другое промежуточное программное обеспечение, если не хотите, чтобы код повторялся

 // middlewares/handleValidationError.js
const { validationResult } = require("express-validator");

exports.handleValidationError = function (req, res, next) {
  // Finds the validation errors in this request and wraps them in an object with handy functions
  const errors = validationResult(req);
  if (!errors.isEmpty()) {
    return res.status(400).json({ errors: errors.array() });
  }
  next();
};

// Using the middleware
// App.js

const { handleValidationError } = require("/middlewares/handleValidationError");

router.get(
  "/start-stop-jobs",
  header("x-cronjob-secret").equals(process.env.CRONJOB_SECRET),
  handleValidationError,
  async (req: Request, res: Response) => {
    const log = {
      secret: process.env.CRONJOB_SECRET,
      equals: req.headers["x-cronjob-secret"],
      started: [],
      stopped: [],
      error: {},
    };
    // stop any events
    console.log("Completed /start-stop-jobs", log);
    return res.json({ status: "ok", log });
  }
);
 

Комментарии:

1. Спасибо Бао, потрясающий ответ, приятель 🙂