Как я могу вернуть Multer Error клиенту при использовании Express-Validator? - PullRequest
0 голосов
/ 06 февраля 2019

Обновлено сообщение: Прокрутите до нижней части сообщения для получения обновленной информации


Исходное сообщение

Мне нужна помощь по этому вопросу.Я создаю маршрут, который принимает 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)
})

Я оставлю этот вопрос открытым, если у кого-то есть лучшее решение для получения того, что я изначально намеревался сделать, кроме кода выше.

Ответы [ 2 ]

0 голосов
/ 23 августа 2019

Эй, я оставлю вам некоторые фрагменты, которые мне помогли,

  • Multer без использования файла

    const express = require('express');
    const multer = require('multer');
    const router = express.Router();
    const { check, validationResult } = require('express-validator');
    
    var upload = multer();
    
    var tagCreateValidator = [
      check('name', 'Name is required')
        .not()
        .isEmpty()
    ];
    
    // @route   POST api/tags
    // @desc    Create Tag
    // @access  Public
    router.post('/', upload.any(), tagCreateValidator, (req, res, next) => {
      const errors = validationResult(req);
      if (!errors.isEmpty()) {
        return res.status(400).json({ errors: errors.array() });
      }
    
      res.send(req.body);
    });
    
  • этос файлом, хотя я не использую экспресс-валидатор прямо сейчас, я обновлю этот ответ, как только это будет сделано

    const express = require('express');
    const Multer = require('multer');
    const gcsMiddlewares = require('../../gcs_middleware');
    const router = express.Router();
    
    const multer = Multer({
      storage: Multer.storage,
      limits: {
        fileSize: 10 * 1024 * 1024 //Maximum file size is 10MB
      }
    });
    
    // @route   POST api/users
    // @desc    Register user
    // @access  Public
    router.post(
      '/',
      multer.single('avatar'),
      gcsMiddlewares.sendUploadToGCS,
      (req, res, next) => {
        var imageUrl;
        if (req.file && req.file.gcsUrl) {
          imageUrl = req.file.gcsUrl;
        }
        var responseBody = {
          file: imageUrl,
          body: req.body
        };
    
        res.send(req);
      }
    );
    
    module.exports = router;
    
0 голосов
/ 06 февраля 2019

Вы можете получить ошибку, вызвав промежуточное программное обеспечение imageUpload напрямую, а не использовать его в цепочке промежуточного программного обеспечения, как в вашем коде.

Непроверенный фрагмент, но, надеюсь, по крайней мере подтолкнет вас в нужном направлениинаправление:

router.post('/addnewproperty', validationChecks, (req, res, next) => {  
    const errors = validationResult(req);

    if (!errors.isEmpty()) {
        console.log('text validation FAILED');
        return res.status(400).json({
            errors: errors.array()
        });
    }

    imageUpload(req, res, (multerErr) => {
        if(multerErr){
            console.log('Multer validation FAILED');
            return res.status(400).json({
                errors: [multerErr.message]
            });
        }else{
            console.log('validation PASSED');
        }  
    });
})

Для получения дополнительной информации по этому вопросу приведены официальные документы Multer по обработке ошибок .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...