为什么express验证器没有拒绝此请求



为什么express验证器不拒绝此请求?

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

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

这应该是因为"快速验证器";需要调用另一个CCD_ 2函数。根据文件:

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

相关内容

最新更新