#express #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":{}}}
Это кажется тривиальным вариантом использования. Чего мне не хватает?
Ответ №1:
Это должно быть связано с тем, что «экспресс-валидатор» нуждается в вызове другой validationResult
функции. Согласно документу:
// ...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 });
}
);
Комментарии:
1. Спасибо Бао, потрясающий ответ, приятель 🙂