为什么 express-validator 不拒绝这个请求?

Why is express-validator not rejecting this request?

为什么 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 没有 header 时,我得到这样的回复:

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

这似乎是一个微不足道的用例。我错过了什么?

那应该是因为“express-validator”需要调用另一个 validationResult 函数。每 the doc:

// ...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 });
  }
);