Multer загрузка нескольких файлов - PullRequest
0 голосов
/ 16 февраля 2020

Итак, у меня есть два свойства в моей схеме. 1) ImageCover (один файл) и 2) Изображения (массив изображений)

Я использую метод загружаемого мультипликатора загружать оба этих файла. когда я загружаю оба, это работает. Но когда я пытаюсь загрузить только один из них, я получаю сообщение об ошибке, что другое поле не определено. Как я могу это исправить?

1) multer. js

module.exports = () => {
    let multer = require('multer')

    let myStorage = multer.diskStorage({
        destination: (req, file, cb) => {
            cb(null, './uploads/')
        },
        filename: (req, file, cb) => {
            cb(null, `${Date.now()}-${file.originalname}`)
        }
    })

    filter = (req, file, cb) => {
        let mimeType = file.mimetype.split('/')[0]
        if (mimeType !== 'image') {
            req.fileError = true
            cb(null, false)
        } else {
            cb(null, true)
        }
    }

    let upload = multer({
        storage: myStorage,
        fileFilter: filter
    })
    return upload
}

2) загрузка файла фотографии

module.exports = function Check(req) {
    if (req.files.images) {
        req.body.images = []
        let allFiles = req.files.images
        allFiles.forEach(file => {
            let mimeType = file.mimetype.split('/')[0]
            if (mimeType !== 'image') {
                fs.unlink(path.join(process.cwd(), 'uploads/'), (err, done) => {
                    if (err) console.log(err)
                })
            }
            req.body.images.push(file.filename)
        })
    }
    if (req.files.imageCover[0]) {
        let file = req.files.imageCover[0]
        let mimeType = file.mimetype.split('/')[0]
        if (mimeType !== 'image') {
            fs.unlink(path.join(process.cwd(), 'uploads/'), (err, done) => {
                if (err) console.log(err)
            })
        }
        req.body.imageCover = file.filename
    } 
}

3) создать контроллер (проверьте это функция, которую я экспортировал выше)

exports.createTour = (req, res, next) => {
    check(req)
    if (req.fileError) { return next({ error: 'invalid file format dude' }) }
    Tour.create({
        ...req.body,
        owner: req.user._id
    }).then(result => {
        res.status(201).json({
            status: 'success',
            total: result.length,
            result
        })
    }).catch(err => next(err))
}

4) Обработчик маршрута

Router.route('/')    
.post(authController.protect,
    upload.fields([
        {
            name: 'imageCover', maxCount: 1,
        }, 
        {
            name: 'images', maxCount: 10
        }
    ]),
    tourController.createTour)

ответ в почтальоне, когда я выбираю только изображения

1 Ответ

0 голосов
/ 17 февраля 2020

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

Например:

 if (req.files.imageCover[0])

попытаться выполнить рефакторинг в выглядеть следующим образом:

if (req.files.hasOwnProperty("imageCover") && req.files.imageCover.length > 0)

вы должны выполнять такие проверки во всех местах, где объекты / массивы могут быть необязательными

...