Обновлено сообщение: Прокрутите до нижней части сообщения для получения обновленной информации
Исходное сообщение
Мне нужна помощь по этому вопросу.Я создаю маршрут, который принимает FormData, проверяет данные файла через Multer (изображения в данном случае), затем проверяет строковые данные , используя Экспресс-валидатора .Я создал рабочий маршрут, который завершает обе проверки, но я не могу понять, как взять какие-либо ошибки из Multer и вернуть их клиенту.
Я установил Multer до Экспресс-валидатор , так что необходимое тело может быть прочитано Экспресс-валидатор .При этом я не могу понять, как (или если вообще могу) передавать ошибки Multer для отправки обратно в ответ.
Мой пример ниже долженвключите все необходимое для экзамена, но если вам нужна дополнительная информация, пожалуйста, дайте мне знать.
const multer = require('multer')
const {
check,
validationResult
} = require('express-validator/check');
const {
sanitizeBody
} = require('express-validator/filter');
const imageUpload = multer({
dest: 'uploads/',
limits: {
fileSize: 1000000
},
fileFilter: function (req, file, cb) {
let filetypes = /jpeg|jpg/;
let mimetype = filetypes.test(file.mimetype);
let extname = filetypes.test(path.extname(file.originalname).toLowerCase());
if (mimetype && extname) {
return cb(null, true);
}
cb(new Error('Invalid IMAGE Type'))
}
}).fields([{
name: 'cover_image',
maxCount: 1
},
{
name: 'more_images',
maxCount: 2
}
])
const validationChecks = [
check('street', 'Invalid Street Name').matches(/^[a-z0-9 ]+$/i).isLength({
min: 1,
max: 25
}).trim().escape(),
check('city', 'Invalid City Name').matches(/^[a-z ]+$/i).isLength({
min: 1,
max: 15
}).trim().escape()
]
router.post('/addnewproperty', imageUpload, validationChecks,(req, res, next) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
console.log('text validation FAILED');
return res.status(400).json({
errors: errors.array()
});
}
console.log('validation PASSED');
})
Обновление 2/6/19
Хорошо, я думаю, что нашел решение , хотя и не то, что ожидал.
Используя функцию next()
в Express, я могу использовать Multer в первом обработчике маршрута, где я могу получать и отправлять ошибки Multer в ответе.Если в этом первом обработчике маршрутов не возникает ошибок, я могу позвонить next()
, чтобы затем перейти к следующему обработчику маршрутов для использования экспресс-валидатора, где я могу проверять и отправлять любые ошибки, возникающие в результате проверки строки.
Код ниже является рабочим примером того, что я описываю.Не уверен, что это приемлемый код, но он работает после небольшого тестирования.Любые мнения или рекомендации по этому поводу приветствуются в комментариях ниже.
// Here's the meat of what I changed.
// The config and variables set in the previous code are the same.
router.post('/addnewproperty',(req, res, next) => {
imageUpload(req,res,(err)=>{
if(err){
console.log(err.message);
return res.status(400).json(err.message)
}
next()
})
})
router.post('/addnewproperty',validationChecks,(req,res)=>{
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({
errors: errors.array()
});
}
return res.sendStatus(200)
})
Я оставлю этот вопрос открытым, если у кого-то есть лучшее решение для получения того, что я изначально намеревался сделать, кроме кода выше.