У меня есть форма, где у меня есть поля, такие как местоположение, возраст и изображение. Я отправляю эти три поля в форме data.
location: 'Location 1',
age: 23,
image: (binary)
В бэкэнде я использую express и express -validator для проверки полей формы.
var imageUpload= multer({
storage: multer.diskStorage({
destination: (req, file, cb) => {
cb(null, 'uploads/top-level')
},
filename: function (req, file, cb) {
cb(null, file.originalname.split('.')[0] + '-' + Date.now() + path.extname(file.originalname))
}
}),
fileFilter: (req, file, cb) => {
if (file.mimetype == "image/png" || file.mimetype == "image/jpg" || file.mimetype == "image/jpeg") {
cb(null, true);
} else {
return cb(new Error('Only .png, .jpg and .jpeg format allowed!'), false);
}
}
});
module.exports = { imageUpload};
I впервые попробовал с этим
router.post('/someroute', [isLoggedIn], create);
и вот create
функция для фактической логики c
const create = async (req, res, next) => {
fileUploadNow(req, res, async function(err) { // uploading file
if (err) {
return res.status(422).send(unExpectedError(
'Only .png, .jpg and .jpeg format allowed!',
'Only .png, .jpg and .jpeg format allowed!',
'image'
))
}
check('location').isLength({ min: 3, max: 35}).withMessage('name must be at least 3 or maximum 35 characters long').trim().escape();
check('age').isInt().withMessage('should be a number');
const errors = await validationResult(req);
if (!errors.isEmpty()) {
return res.status(422).send({
message: 'Got error while submitting',
data: errors.array()
});
}
if (!req.file) {
return res.status(422).send(unExpectedError(
'Please select a thumbnail',
'Please select a thumbnail',
'image'
))
}
try {
let image_path = config.SERVER_URL + '/' + req.file.filename;
const {location, age} = req.body;
let obj = {
location: semester_name,
slug: image_path,
age: age
}
let result = await knex('table').insert(obj).returning('*');
if (result) {
return res.status(200).send({
message: 'successfull',
data: result
})
}
} catch (err) {
console.log(err)
return res.status(422).send(unExpectedError(
'Something went wrong, please try to add details again',
'Something went wrong, please try to add semester details again',
'semester'
))
}
})
}
С этим кодом я могу обработать ошибку для поля изображения и Я могу показать ошибки изображения пользователю , но не для данных, поступающих в req.body
. может быть, нам нужно проверить часть проверки req.body только в промежуточном программном обеспечении маршрута.
Затем я попытался изменить следующим образом
router.post ('/ someroute', [isLoggedIn, imageUpload , Валидация], создать); // Я импортировал эти две функции
и Validation
const { check, validationResult } = require('express-validator');
const Validation= [
check('location').isLength({ min: 3, max: 35}).withMessage('name must be at least 3 or maximum 35 characters long').trim().escape(),
check('age').isInt().withMessage('should be a number')
];
module.exports = { Validation}
В показанной выше функции create
я удалил функцию fileUploadNow и сохранил только часть logi c. Теперь в этом все работает, я получаю ошибку, которая генерируется req.body, а также я получаю ошибку изображения в консоли браузера (500 код состояния) , если выбран неправильный тип изображения, но я не удалось обработать ошибку изображения, что означает Я не могу показать ее пользователям . Как мне обрабатывать и показывать пользователю ошибки для изображения и части req.body