【问题标题】:Why is express-validator not rejecting this request?为什么 express-validator 不拒绝此请求?
【发布时间】:2021-06-30 17:32:34
【问题描述】:

为什么 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 express-validator


    【解决方案1】:

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

    【讨论】:

    • 谢谢包,很棒的回答哥们:-)
    猜你喜欢
    • 1970-01-01
    • 2023-02-14
    • 2017-02-04
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多