首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么express-validator没有拒绝这个请求?

为什么express-validator没有拒绝这个请求?
EN

Stack Overflow用户
提问于 2021-07-01 01:32:34
回答 1查看 21关注 0票数 -1

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

代码语言:javascript
复制
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时,得到的响应如下:

代码语言:javascript
复制
{"status":"ok","log":{"secret":"CRONJOB_SECRET","started":[],"stopped":[],"error":{}}}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-01 03:57:22

这应该是因为“快速验证器”需要调用另一个validationResult函数。每个the doc

代码语言:javascript
复制
// ...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)。这就是你的代码中缺失的部分。

如果您不想重复代码,可以将此功能提取到另一个中间件中

代码语言:javascript
复制
// 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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68199242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档