Тело запроса пусто при отправке данных с использованием «данных формы» - PullRequest
0 голосов
/ 24 января 2020

Когда я обновляю с использованием raw JSON, он работает, но когда я использую данные формы, он не обновляется. Тело запроса при использовании данных формы является пустым объектом. Почему это происходит?

Вот мой код обновления:

exports.updateProgram = catchAsync(async (req, res, next) => {
    console.log('req ko body',req.body)
    let doc = await Program.findByIdAndUpdate(req.params.id, req.body, { runValidators: true, new: true })
    if (!doc) {
        return next(new AppError('No document found with that ID', 404))
    }
    res.status(200).json({
        status: 'success!',
        data: { doc }
    })
})

В Почтальоне:

Request example

Я использую Multer, я на самом деле передать фото в req.body. Вот код:

let multerStorage = multer.memoryStorage()

let multerFilter = (req, file, cb) => {
    if (file.mimetype.split('/')[0] == 'image') {
        cb(null, true)
    } else {
        cb(new AppError('Not an image!', 400), false)
    }
}

let upload = multer({
    storage: multerStorage,
    fileFilter: multerFilter
})

exports.uploadPhotos =  upload.fields([
    { name: 'abcd', maxCount: 10 },
    { name: 'photos', maxCount: 10 },
    {name: 'photos3', maxCount: 10}
])

exports.resizePhotos = catchAsync(async (req, res, next) => {
    // if (!req.files.photos || !req.files.abcd) return next()
    if(req.files.abcd) {
    req.body.abcd = []
   await Promise.all(req.files.abcd.map(async (file, i) => {
       let filename = `tour-${Date.now()}-${i + 1}.jpeg`
       await sharp(file.buffer)
       .resize(500,500)
       .toFormat('jpeg')
       .jpeg({ quality: 90 })
       .toFile(`public/img/arpit/${filename}`)
       req.body.abcd.push(filename)
   }) 
   )} else if(req.files.photos3) {
    req.body.photos3 = []
    await Promise.all(req.files.photos3.map(async (file, i) => {
        let filename = `tour-${Date.now()}-${i + 1}.jpeg`
        await sharp(file.buffer)
        .resize(500,500)
        .toFormat('jpeg')
        .jpeg({ quality: 90 })
        .toFile(`public/img/arpit/${filename}`)
        req.body.photos3.push(filename)
    }) 
    )}
   else if(req.files.photos) {
    // console.log('codee here')
    // } else if(req.body.photos) {
     req.body.photos = []
     console.log('req.files>>>', req.files)
    await Promise.all(req.files.photos.map(async (file, i) => {
        let filename = `tour-${Date.now()}-${i + 1}.jpeg`
        await sharp(file.buffer)
        .resize(500,500)
        .toFormat('jpeg')
        .jpeg({ quality: 90 })
        .toFile(`public/img/programs/${filename}`)
        req.body.photos.push(filename)
    })
    )
}
    return next()
})

Я импортирую в файл маршрутов

routes file example

Ответы [ 2 ]

0 голосов
/ 24 января 2020
var cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]);
app.post('/cool-profile', cpUpload, function (req, res, next) {


    // req.files is an object (String -> Array) where fieldname is the key, and the value is array of files
      //
      // e.g.
      //  req.files['avatar'][0] -> File
      //  req.files['gallery'] -> Array
      //
      // req.body will contain the text fields, if there were any

})

Это может вам помочь. Цитируется https://www.npmjs.com/package/multer#readme

0 голосов
/ 24 января 2020

Express (bodyParser) не может обрабатывать многокомпонентные данные формы, и поэтому ваш код не работает.

Взгляните на multer , пакет express , Это промежуточное ПО, обеспечивающее необходимую вам функциональность.

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