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

问题描述

为什么 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":{}}}

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

解决方法

那应该是因为“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 });
  }
);